আমি নিশ্চিত যে এটি করার অনেকগুলি উপায় রয়েছে: আমি কীভাবে একটি পাঠ্য ফাইলে লাইন সংখ্যা গণনা করতে পারি?
$ <cmd> file.txt
1020 lines
আমি নিশ্চিত যে এটি করার অনেকগুলি উপায় রয়েছে: আমি কীভাবে একটি পাঠ্য ফাইলে লাইন সংখ্যা গণনা করতে পারি?
$ <cmd> file.txt
1020 lines
উত্তর:
মানক উপায়টি এর সাথে রয়েছে wc
, এটির কী গণনা করা উচিত তা নির্দিষ্ট করতে আর্গুমেন্ট গ্রহণ করে (বাইটস, অক্ষর, শব্দ ইত্যাদি); -l
লাইনের জন্য:
$ wc -l file.txt
1020 file.txt
cat matlab.git.diff | sed -e '/^\+[ ]*.*\%$/d' | wc -l
। /regexp/d
যদি এটা সাথে মেলে একটি লাইন মুছে ফেলে regexp
, এবং -e
জন্য পর্যাপ্ত (IMNSHO) সিনট্যাক্স সক্রিয় regexp
।
grep -v '^+ *%' matlab.git.diff | wc -l
?
grep
মন্তব্য হিসাবে বিবেচনা করার জন্য আপনার কমান্ডটি পরিবর্তন করা সম্ভব " + Hello"
(স্পেস (গুলি) এর আগে নোট করুন +
)?
grep -v '^ *+' matlab.git.diff | wc -l
(আমি ধরে নিচ্ছি যে উদ্ধৃতি চিহ্নগুলি আসলে লাইনটির অংশ হিসাবে বোঝানো হয়নি; আমি আরও ধরে নিয়েছি যে সামনে এবং ফাঁকা স্থান ছাড়াও উভয় লাইনই +
মন্তব্য করা হয়েছিল; কমপক্ষে একটি স্থান বাধ্যতামূলক, হয় তারা *
দিয়ে প্রতিস্থাপন করুন \+
, বা তারার সামনে অন্য একটি স্থান যুক্ত করুন)। সম্ভবত কেবল ফাঁকা জায়গাগুলির সাথে মিল রেখে আপনি স্বেচ্ছাসেবীর সাথে মিলিয়ে দেখতে চান; এটির জন্য স্থানটি প্রতিস্থাপন করুন [[:space:]]
। মনে রাখবেন যে %
এটি আপনার উদাহরণটিতে না থেকে আমি ম্যাচটিও মুছে ফেলেছি ।
মাইকেল যেমন বলেছিল, 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
স্টিভেন ডি জিএনইউ ভুলে গেছেন sed
:
sed -n '$=' file.txt
এছাড়াও, যদি আপনি ফাইলের নাম আউটপুট না করেই গণনা চান এবং আপনি ব্যবহার করছেন wc
:
wc -l < file.txt
কেবল এটির হ্যাকের জন্য:
cat -n file.txt | tail -n 1 | cut -f1
grep -c ''
, বা tr -dc '\n' | wc -c
, বা nl -ba -nln | tail -n 1 |sed -e 's/[^0-9].*//'
... এগুলির কোনওটি কি নিজের মধ্যে কার্যকর (কোনও প্রোগ্রাম তৈরির বিষয়ে বিপরীতে যেমন গণনা রেখার চেয়ে আরও বেশি কিছু করে), wc -l
খাঁটি (খ) ছাড়া অন্য কি?
sed 's/.*//' file.txt | uniq -c
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' -
। bc
POSIX হল: uniq -c file.txt | cut -c -7 | sed -n ':a;${s/\n/ + /gp;b};N;ba' | bc
। সহজ উত্তর আপনি একটি সীমিত লাইন দৈর্ঘ্য অনুমান যদি: uniq -c -f 100000 file.txt
।
সতর্কতার শব্দ ব্যবহার করার সময়
wc -l
কারণ ডাব্লুসিএল-এল গণনা করে ফাংশন করে \ n, যদি আপনার ফাইলের শেষ লাইনটি কোনও নতুন লাইনে কার্যকরভাবে শেষ না হয় তবে লাইন গণনাটি 1 দিয়ে বন্ধ হয়ে যাবে the (সুতরাং আপনার ফাইলের শেষে পুরানো কনভেনশনটি নিউলাইন ছেড়ে যাবে)
যেহেতু আমি কখনই নিশ্চিত হতে পারি না যে কোনও প্রদত্ত ফাইল নতুন লাইন দিয়ে শেষ লাইনটি শেষ করার কনভেনশন অনুসরণ করে বা না, তাই আমি এই বিকল্প কমান্ডগুলির মধ্যে যে কোনওটিই লাইনকে গণনাতে অন্তর্ভুক্ত করবে এমনটি ব্যবহার করার পরামর্শ দিচ্ছি না নিউ লাইন হোক না কেন।
sed -n $= filename
perl -lne 'END { print $. }' filename
awk 'END {print NR}' filename
grep -c '' filename
আপনার কাছে কেবল বাশ এবং কোনও বাহ্যিক সরঞ্জাম উপলব্ধ না থাকলে আপনি নিম্নলিখিতগুলিও করতে পারেন:
count=0
while read
do
((count=$count+1))
done <file.txt
echo $count
ব্যাখ্যা: লুপটি লাইনে স্ট্যান্ডার্ড ইনপুট লাইন পড়ে read
; ( যেহেতু আমরা যেভাবে যাইহোক পঠন ইনপুট দিয়ে কিছুই করি না, এটি সংরক্ষণ করার জন্য কোনও ভেরিয়েবল সরবরাহ করা হয় না) এবং count
প্রতিবার পরিবর্তনশীল বাড়িয়ে তোলে । পুনঃনির্দেশের কারণে ( <file.txt
পরে done
), লুপটির জন্য স্ট্যান্ডার্ড ইনপুট file.txt
।