मुझे यकीन है कि ऐसा करने के कई तरीके हैं: मैं एक टेक्स्ट फ़ाइल में लाइनों की संख्या कैसे गिन सकता हूं?
$ <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
स्टीवन डी भूल गए GNU 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
(भले ही यह POSIX नहीं है)? 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
क्योंकि w -l फ़ंक्शन \ n की गणना के द्वारा होता है, यदि आपकी फ़ाइल में अंतिम पंक्ति एक नई पंक्ति में प्रभावी रूप से समाप्त नहीं होती है, तो पंक्ति संख्या 1 से बंद हो जाएगी (इसलिए आपकी फ़ाइल के अंत में नई पंक्ति छोड़ रहा पुराना सम्मेलन)
चूँकि मैं कभी सुनिश्चित नहीं हो सकता कि यदि कोई दी गई फ़ाइल अंतिम पंक्ति को एक नई पंक्ति के साथ समाप्त करने के सम्मलेन का अनुसरण करती है या नहीं, तो मैं इनमें से किसी भी वैकल्पिक आदेश का उपयोग करने की सलाह देता हूँ जिसमें नई पंक्ति की परवाह किए बिना गिनती में अंतिम पंक्ति शामिल होगी या नहीं।
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
।