एक फ़ाइल में लाइनों की गिनती


64

मुझे यकीन है कि ऐसा करने के कई तरीके हैं: मैं एक टेक्स्ट फ़ाइल में लाइनों की संख्या कैसे गिन सकता हूं?

$ <cmd> file.txt
1020 lines

जवाबों:


98

मानक तरीका है wc, जो यह निर्दिष्ट करने के लिए तर्क लेता है कि उसे क्या गिनना चाहिए (बाइट्स, वर्ण, शब्द, आदि); -lलाइनों के लिए है:

$ wc -l file.txt
1020 file.txt

यदि मैं टिप्पणियों को अनदेखा करना चाहता हूं, तो मैं फ़ाइल में लाइनें कैसे गिनूं ? विशेष रूप से, मैं उन रेखाओं की गणना नहीं करना चाहता हूं जो एक +, कुछ सफेद स्थान (कोई सफेद स्थान नहीं हो सकता है) के साथ शुरू होती हैं और फिर एक%, जिस तरह से टिप्पणी लाइनें एक MATLAB फ़ाइल के गिट भिन्न रूप में दिखाई देती हैं। मैंने इसे grep के साथ करने की कोशिश की, लेकिन सही नियमित अभिव्यक्ति का पता नहीं लगा सका।
गदाल्या

@ गाल्ड्या मुझे आशा है कि निम्नलिखित पाइपलाइन ऐसा करेगी (कोई परीक्षण पूर्ण नहीं थे) cat matlab.git.diff | sed -e '/^\+[ ]*.*\%$/d' | wc -l:। /regexp/dयदि यह मेल खाता है regexp, तो एक लाइन हटाता है और इसके लिए -eपर्याप्त (IMNSHO) सिंटैक्स चालू करता है regexp
21

2
बस क्यों नहीं grep -v '^+ *%' matlab.git.diff | wc -l?
celtschk

@celtschk, जब तक यह सामान्य रूप से टिप्पणी लाइनों में है: क्या यह संभव है grepकि आप टिप्पणी से संबंधित मामलों पर विचार करने के लिए अपनी कमांड को संशोधित कर सकें " + Hello"( जैसे कि स्पेस को नोट करें +)?
सिल्पाजो डी एरियेरेज़

1
@SopalajodeArrierez: निश्चित रूप से यह संभव है: 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

स्टीवन डी भूल गए GNU 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(भले ही यह POSIX नहीं है)? 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

क्योंकि w -l फ़ंक्शन \ n की गणना के द्वारा होता है, यदि आपकी फ़ाइल में अंतिम पंक्ति एक नई पंक्ति में प्रभावी रूप से समाप्त नहीं होती है, तो पंक्ति संख्या 1 से बंद हो जाएगी (इसलिए आपकी फ़ाइल के अंत में नई पंक्ति छोड़ रहा पुराना सम्मेलन)

चूँकि मैं कभी सुनिश्चित नहीं हो सकता कि यदि कोई दी गई फ़ाइल अंतिम पंक्ति को एक नई पंक्ति के साथ समाप्त करने के सम्मलेन का अनुसरण करती है या नहीं, तो मैं इनमें से किसी भी वैकल्पिक आदेश का उपयोग करने की सलाह देता हूँ जिसमें नई पंक्ति की परवाह किए बिना गिनती में अंतिम पंक्ति शामिल होगी या नहीं।

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

अच्छा सारांश। और यूनिक्स और लिनक्स में
सेबस्टियन

एचएम वास्तव में अंतिम टुकड़ा है?
gena2x

1
मुझे यकीन है कि यह हर किसी के usecase पर निर्भर करता है; 'लास्ट पीस' के लिए आम तौर पर टेक्स्ट की एक लाइन होती है, जिसे किसी ने नई लाइन के साथ बंद नहीं किया था। हमारे पास जो सबसे अधिक एनकाउंटर होता है, वह एक ऐसी फाइल होती है जिसमें टेक्स्ट की एक स्ट्रिंग होती है जो एक नई पंक्ति में समाप्त नहीं होती है। wc -l इसे "0" के रूप में गिना जाएगा, जब मैं अन्यथा "1" की गिनती की उम्मीद करूंगा।
प्रेट्ज़ेल 1337

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, चाहे इसकी अंतिम पंक्ति में अंत में एलएफ चरित्र हो या नहीं।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.