सादे पाठ फ़ाइल में एक चार की घटनाओं की गणना


132

क्या लिनेक्स / टर्मिनल के तहत गणना करने का कोई तरीका है, एक सादे पाठ फ़ाइल में कितनी बार चार एफ होता है?


9
तकनीकी रूप से इसे श / बैश / आदि माना जा सकता है। प्रोग्रामिंग सवाल है, तो मुझे लगता है कि इसकी दोनों जगह वैधता है।
रॉब ह्रस्का

@ रॉब ह्रस्का: हाँ, मुझे भी लगता है कि प्रोग्रामिंग प्रोग्रामिंग है ... @abrashka: आपके पहले और दूसरे प्रश्न का उत्तर "NO" है!
कपकोब

जवाबों:


178

इस बारे में कैसा है:

fgrep -o f <file> | wc -l

नोट: याद रखने / डुप्लिकेट करने और कस्टमाइज़ करने में बहुत आसान होने के अलावा, यह Vereb के उत्तर की तुलना में लगभग तीन गुना (क्षमा करें, संपादित करें! पहला परीक्षण बॉटक्ड) है।


यह एक काम नहीं करता है अगर आपको गिनती \rया \nवर्णों की आवश्यकता है ; tr -cd fजवाब यह है कि के लिए काम करता है।
bjnord

3
कई पात्रों, जैसे गिनती करने के लिए a, bऔर c, का उपयोग egrep: egrep -o 'a|b|c' <file> | wc -l
स्किप्पी ले ग्रैंड गौरू

इसके अलावा, उत्तर के wc -cरूप में उपयोग नहीं करने के लिए सावधान रहें tr: चूंकि grepलाइन द्वारा आउटपुट लाइन, wcवर्णों के रूप में अंत-की-पंक्तियों की गणना करेगी (इसलिए वर्णों की संख्या दोगुनी)।
Skippy le Grand Gourou

@bjnord के लिए ठीक है \r, लेकिन यह गिनने के लिए \nकि सिर्फ उपयोग क्यों नहीं wc -l?
स्किप्पी ले ग्रैंड गौरू

67

और भी तेज:

tr -cd f < file | wc -c

4.9 एमबी और खोजे गए चरित्र के 1100000 घटनाओं के साथ इस कमांड के लिए समय :

real   0m0.089s
user   0m0.057s
sys    0m0.027s

Vereb जवाब के लिए समय के साथ echo, cat, trऔर bcएक ही फाइल के लिए:

real   0m0.168s
user   0m0.059s
sys    0m0.115s

रोब Hruska जवाब के लिए समय के साथ tr, sedऔर wcएक ही फ़ाइल के लिए:

real   0m0.465s
user   0m0.411s
sys    0m0.080s

एक ही फ़ाइल के साथ fgrepऔर उसके लिए Jefromi उत्तर का समय wc:

real   0m0.522s
user   0m0.477s
sys    0m0.023s 

3
कई वर्णों, जैसे a, bऔर c: की गणना करने के लिए tr -cd abc < file | wc -l
स्किप्पी ले ग्रांड गौरू

क्या आपको यकीन है? tr -cd abc < file | wc -cइसके बजाय मान लीजिए
मिथुन बी

10
echo $(cat <file>  | wc -c) - $(cat <file>  | tr -d 'A' | wc -c) | bc

जहां ए चरित्र है

4.9 MB और खोजे गए वर्ण के 1100000 आवृत्तियों वाली फ़ाइल के साथ इस आदेश के लिए समय:

real   0m0.168s
user   0m0.059s
sys    0m0.115s

1
यह लगभग एक तिहाई तेज़ हो जाता है यदि आप अनावश्यक catएस को बाहर निकालते हैं , फ़ाइल नाम को तर्क के रूप में देते हैं wcऔर tr
कैस्केबेल

1
यदि आप वास्तव में इसे अनुकूलित करना चाहते हैं तो फ़ाइल को केवल एक बार पढ़ें: इको $ (स्टेट -c% s <फ़ाइल>) - $ (बिल्ली <फ़ाइल> | tr -d 'A' | wc -c) | bc
Vereb

@ वीएआरबी - टीआरए केवल पढ़ता है stdin, लेकिन यह catएड के बजाय पाइप किया जा सकता है :tr -d 'A' < <file> | wc ...
dsz

7

यदि आपको केवल अपने चरित्र से युक्त रेखाओं की संख्या गिननी है, तो यह काम करेगा:

grep -c 'f' myfile

हालाँकि, यह एकल मेल के समान लाइन पर 'f' की कई घटनाओं को गिनता है।


4

tr -d '\n' < file | sed 's/A/A\n/g' | wc -l

अपने चरित्र के साथ "ए" की दो घटनाओं की जगह, और अपनी इनपुट फ़ाइल के साथ "फ़ाइल"।

  • tr -d '\n' < file: नई टिप्पणियाँ निकालता है
  • sed 's/A/A\n/g: "ए" की हर घटना के बाद एक नई पंक्ति जोड़ता है
  • wc -l: लाइनों की संख्या गिनता है

उदाहरण:

$ cat file
abcdefgabcdefgababababbbba


1234gabca

$ tr -d '\n' < file | sed 's/a/a\n/g' | wc -l
9
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.