একটি ফাইল লাইন গণনা


64

আমি নিশ্চিত যে এটি করার অনেকগুলি উপায় রয়েছে: আমি কীভাবে একটি পাঠ্য ফাইলে লাইন সংখ্যা গণনা করতে পারি?

$ <cmd> file.txt
1020 lines

উত্তর:


98

মানক উপায়টি এর সাথে রয়েছে wc, এটির কী গণনা করা উচিত তা নির্দিষ্ট করতে আর্গুমেন্ট গ্রহণ করে (বাইটস, অক্ষর, শব্দ ইত্যাদি); -lলাইনের জন্য:

$ wc -l file.txt
1020 file.txt

আমি মন্তব্য উপেক্ষা করতে চাইলে আমি কোনও ফাইলের লাইনগুলি কীভাবে গণনা করব ? বিশেষত, আমি লাইনগুলি গণনা করতে চাই না যেগুলি +, কিছু সাদা স্থান (কোনও সাদা স্থান হতে পারে না) এবং তার পরে% 1 দিয়ে শুরু হয়, যা ম্যাটল্যাব ফাইলের গিট ডিফারেন্টে মন্তব্য লাইনের মাধ্যমে প্রদর্শিত হয়। আমি গ্রেপ দিয়ে এটি করার চেষ্টা করেছি, তবে সঠিক নিয়মিত অভিব্যক্তিটি বের করতে পারিনি।
Gdalya

@Gdalya আমি আশা করি নিম্নলিখিত পাইপলাইন করব (কোন পরীক্ষার perfomed হয়েছে): cat matlab.git.diff | sed -e '/^\+[ ]*.*\%$/d' | wc -l/regexp/dযদি এটা সাথে মেলে একটি লাইন মুছে ফেলে regexp, এবং -eজন্য পর্যাপ্ত (IMNSHO) সিনট্যাক্স সক্রিয় regexp
dbanet

2
কেন সহজভাবে নয় grep -v '^+ *%' matlab.git.diff | wc -l?
celtschk

@celtschk, যতক্ষণ না মন্তব্য লাইনে এটি যথারীতি: grepমন্তব্য হিসাবে বিবেচনা করার জন্য আপনার কমান্ডটি পরিবর্তন করা সম্ভব " + Hello"(স্পেস (গুলি) এর আগে নোট করুন +)?
সোপালাজো ডি অ্যারিরিজ

1
@ সোপালাজোডে আরিরিজেজ: অবশ্যই এটি সম্ভব: grep -v '^ *+' matlab.git.diff | wc -l(আমি ধরে নিচ্ছি যে উদ্ধৃতি চিহ্নগুলি আসলে লাইনটির অংশ হিসাবে বোঝানো হয়নি; আমি আরও ধরে নিয়েছি যে সামনে এবং ফাঁকা স্থান ছাড়াও উভয় লাইনই +মন্তব্য করা হয়েছিল; কমপক্ষে একটি স্থান বাধ্যতামূলক, হয় তারা *দিয়ে প্রতিস্থাপন করুন \+, বা তারার সামনে অন্য একটি স্থান যুক্ত করুন)। সম্ভবত কেবল ফাঁকা জায়গাগুলির সাথে মিল রেখে আপনি স্বেচ্ছাসেবীর সাথে মিলিয়ে দেখতে চান; এটির জন্য স্থানটি প্রতিস্থাপন করুন [[:space:]]। মনে রাখবেন যে %এটি আপনার উদাহরণটিতে না থেকে আমি ম্যাচটিও মুছে ফেলেছি ।
celtschk

15

মাইকেল যেমন বলেছিল, wc -lযাওয়ার উপায়। কিন্তু শুধু যদি আপনি অস্বাভাবিক আছে bash, perlঅথবা awkকিন্তু wc, এখানে আরো কয়েকটি সমাধান আছেন:

ব্যাশ শুধুমাত্র

$ LINECT=0; while read -r LINE; do (( LINECT++ )); done < file.txt; echo $LINECT

পার্ল সলিউশনস

$ perl -lne 'END { print $. }' file.txt

এবং খুব কম পাঠযোগ্য:

$ perl -lne '}{ print $.' file.txt

আড্ডা সমাধান

$  awk 'END {print NR}' file.txt

15

স্টিভেন ডি জিএনইউ ভুলে গেছেন sed:

sed -n '$=' file.txt

এছাড়াও, যদি আপনি ফাইলের নাম আউটপুট না করেই গণনা চান এবং আপনি ব্যবহার করছেন wc:

wc -l < file.txt

কেবল এটির হ্যাকের জন্য:

cat -n file.txt | tail -n 1 | cut -f1

2
বা grep -c '', বা tr -dc '\n' | wc -c, বা nl -ba -nln | tail -n 1 |sed -e 's/[^0-9].*//'... এগুলির কোনওটি কি নিজের মধ্যে কার্যকর (কোনও প্রোগ্রাম তৈরির বিষয়ে বিপরীতে যেমন গণনা রেখার চেয়ে আরও বেশি কিছু করে), wc -lখাঁটি (খ) ছাড়া অন্য কি?
গিলস

1
@ গিলস: আমি মনে করি প্রশ্নের "বহু উপায়ে" বাক্যটি স্টিভ এবং আমি যে প্রতিদ্বন্দ্বিতায় উঠে এসেছি তা একটি চ্যালেঞ্জকে উদ্বুদ্ধ করেছিল।
ডেনিস উইলিয়ামসন

1
@ গিলস:sed 's/.*//' file.txt | uniq -c
ডেনিস উইলিয়ামসন

2
@ গিলস: ওহ, আপনি প্রথম বোঝাতে চেয়েছিলেন । uniq -c -w 0 file.txtএবং আপনি cut -c -7কেবল সংখ্যা রাখতে পারেন । অথবা, আরও POSIXly: uniq -c file.txt | awk '{c+=$1}END{print c}'। কীভাবে dc(যদিও এটি পসিক্স না)? uniq -c file.txt | cut -c -7 | sed '$alax' | dc -e '[pq]sb[+z1=blax]sa' -bcPOSIX হল: uniq -c file.txt | cut -c -7 | sed -n ':a;${s/\n/ + /gp;b};N;ba' | bc। সহজ উত্তর আপনি একটি সীমিত লাইন দৈর্ঘ্য অনুমান যদি: uniq -c -f 100000 file.txt
ডেনিস উইলিয়ামসন

1
@ জোসিপরোডিন: উক্তি যুক্ত হয়েছে
ডেনিস উইলিয়ামসন

11

সতর্কতার শব্দ ব্যবহার করার সময়

wc -l

কারণ ডাব্লুসিএল-এল গণনা করে ফাংশন করে \ n, যদি আপনার ফাইলের শেষ লাইনটি কোনও নতুন লাইনে কার্যকরভাবে শেষ না হয় তবে লাইন গণনাটি 1 দিয়ে বন্ধ হয়ে যাবে the (সুতরাং আপনার ফাইলের শেষে পুরানো কনভেনশনটি নিউলাইন ছেড়ে যাবে)

যেহেতু আমি কখনই নিশ্চিত হতে পারি না যে কোনও প্রদত্ত ফাইল নতুন লাইন দিয়ে শেষ লাইনটি শেষ করার কনভেনশন অনুসরণ করে বা না, তাই আমি এই বিকল্প কমান্ডগুলির মধ্যে যে কোনওটিই লাইনকে গণনাতে অন্তর্ভুক্ত করবে এমনটি ব্যবহার করার পরামর্শ দিচ্ছি না নিউ লাইন হোক না কেন।

sed -n $= filename
perl -lne 'END { print $. }' filename
awk 'END {print NR}' filename
grep -c '' filename

চমৎকার সংক্ষিপ্তসার। এবং ইউনিক্স এবং লিনাক্সে স্বাগতম
সেবাস্তিয়ান

এইচএম শেষ টুকরা সত্যিই লাইন?
gena2x

1
আমি নিশ্চিত এটি সবার ব্যবহারের উপর নির্ভর করে; 'শেষ টুকরা' সাধারণত পাঠ্যের একটি লাইন যা কেউ একটি নতুন লাইনের সাথে ক্যাপ করেনি। আমি প্রায়শই যে ইউজকেসটির মুখোমুখি হই তা হ'ল পাঠ্যটির একক স্ট্রিং সহ এমন একটি ফাইল যা কোনও নতুন লাইনে শেষ হয় না। wc -l এটিকে "0" হিসাবে গণনা করতাম, যখন আমি অন্যথায় "1" এর গণনা আশা করতাম।
pretzels1337

3

আপনার কাছে কেবল বাশ এবং কোনও বাহ্যিক সরঞ্জাম উপলব্ধ না থাকলে আপনি নিম্নলিখিতগুলিও করতে পারেন:

count=0
while read
do
  ((count=$count+1))
done <file.txt
echo $count

ব্যাখ্যা: লুপটি লাইনে স্ট্যান্ডার্ড ইনপুট লাইন পড়ে read; ( যেহেতু আমরা যেভাবে যাইহোক পঠন ইনপুট দিয়ে কিছুই করি না, এটি সংরক্ষণ করার জন্য কোনও ভেরিয়েবল সরবরাহ করা হয় না) এবং countপ্রতিবার পরিবর্তনশীল বাড়িয়ে তোলে । পুনঃনির্দেশের কারণে ( <file.txtপরে done), লুপটির জন্য স্ট্যান্ডার্ড ইনপুট file.txt


2

আপনি সর্বদা grepনিম্নলিখিত কমান্ডটি ব্যবহার করতে পারেন :

grep -c "^" file.txt

এটির আসল সারিগুলি গণনা করবে file.txt, এটির শেষ সারিটিতে একটি এলএফ অক্ষর রয়েছে কিনা।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.