किसी फ़ाइल में कुल शब्दों की गिनती कैसे करें?


18

मैं एक फ़ाइल में सभी शब्दों की संख्या की गणना करने के लिए एक कमांड की तलाश कर रहा हूं। उदाहरण के लिए यदि कोई फ़ाइल इस प्रकार है,

today is a 
good day

तब यह छपना चाहिए 5, क्योंकि वहां 5शब्द हैं।


7
क्या आपने कोशिश की है wc -w $FILE?
don_crissti

जवाबों:


39

आज्ञा wcउर्फ। शब्द गणना यह कर सकती है:

$ wc -w <file>

उदाहरण

$ cat sample.txt
today is a 
good day


$ wc -w sample.txt
5 sample.txt


# just the number (thanks to Stephane Chazelas' comment)
$ wc -w < sample.txt
5

1
ध्यान दें कि शब्द के लिए wc -wजीएनयू के लिए के रूप में ही परिभाषा नहीं है grep -w। के लिए wcएक शब्द भी एक या अधिक गैर अंतरिक्ष वर्णों का एक क्रम (है [:space:]वर्तमान स्थान में चरित्र वर्ग)। उदाहरण के लिए foo,barऔर foo bar(एक गैर-ब्रेकिंग स्पेस के साथ) प्रत्येक एक शब्द है।
स्टीफन चेजेलस

7

मैं इसके लिए बस नंबर के साथ आया:

wc -w [file] | cut -d' ' -f1

5

मुझे भी wc -w < [file]अप्रोच पसंद है

अंत में, एक चर में केवल शब्द गणना को संग्रहीत करने के लिए, आप निम्नलिखित का उपयोग कर सकते हैं:

myVar=($(wc -w /path/to/file))

इससे आप फ़ाइल नाम को शान से छोड़ सकते हैं।


14
wc -w < "$file"बस संख्या के लिए।
स्टीफन चेजेलस

3

बेहतर समाधान पर्ल का उपयोग कर रहा है:

perl -nle '$word += scalar(split(/\s+/, $_)); END{print $word}' filename

@Bernhard

आप wcकोर मशीन से कमांड कोड के स्रोत की जांच कर सकते हैं , मैं अपनी मशीन में परीक्षण करता हूं, फ़ाइल subst.cमें bash 4.2 स्रोत के साथ।

time wc -w subst.c

real    0m0.025s
user    0m0.016s
sys     0m0.000s

तथा

time perl -nle '$word += scalar(split(" ", $_)); END{print $word}' subst.c

real    0m0.021s
user    0m0.016s
sys     0m0.004s

फ़ाइल जितनी बड़ी होगी, उतना ही कुशल पर्ल सम्मान के साथ है wc


13
यह wc से बेहतर क्यों है?
शुक्राणु

2
@ एक बात के लिए, क्योंकि मेरे बहुत आश्चर्य के लिए, यह बहुत तेज़ लगता है । मैंने इसे 141813504 शब्दों के साथ एक पाठ फ़ाइल पर आज़माया और wc~ 14sec लिया, जबकि Perl ने ~ 5sec लिया!
terdon

3
मुझे लगता है कि 'बड़ा' मुद्दा वास्तव में एक जवाब है जिसमें पर्ल पर निर्भरता है और मैं इस तरह की निर्भरता का बहुत बड़ा प्रशंसक नहीं हूं। यदि प्रश्न प्रदर्शन के बारे में था जो एक और बात होगी।
माइकल डुरंट

5
ध्यान दें कि एक splitको छोड़कर /\s+/एक जैसा है split(' ')कि कोई भी प्रमुख व्हाट्सएप एक अशक्त पहला क्षेत्र पैदा करता है। वह अंतर आपको प्रति पंक्ति लिंक पर एक अतिरिक्त शब्द (अशक्त प्रथम क्षेत्र, वह है) देगा । तो (split(" ", $_))इस तरह से बनाई गई फ़ाइल के लिए अन्यथा का उपयोग करें: echo -e "unix\n linux" > testfileआपका वन-लाइनर 3 शब्दों की रिपोर्ट करता है।
दान_क्रांति

1
आपके समय से पता चलता है कि wc जल्दी है (यह उपयोगकर्ता है और उस मामले में कई बार sys है)। LC_ALL = C के साथ, wcकाफी तेज होगा, ठीक उसी तरह PERLIO=:utf8, जैसे perlकि काफी धीमा होगा।
स्टीफन चेज़लस

3

चलो AWK का उपयोग करें!

$ function wordfrequency() { awk 'BEGIN { FS="[^a-zA-Z]+" } { for (i=1; i<=NF; i++) { word = tolower($i) words[word]++ } } END { for (w in words) printf("%3d %s\n", words[w], w) } ' | sort -rn } 
$ cat your_file.txt | wordfrequency

यह प्रदान की गई फ़ाइल में होने वाले प्रत्येक शब्द की आवृत्ति को सूचीबद्ध करता है। मुझे पता है कि यह वह नहीं है जो आपने मांगा था, लेकिन यह बेहतर है! यदि आप अपने शब्द की घटनाओं को देखना चाहते हैं, तो आप ऐसा कर सकते हैं:

$ cat your_file.txt | wordfrequency | grep yourword

मैंने इस समारोह को अपने .dotfiles में भी जोड़ा


स्रोत: AWK- वार्ड रूबी


यह शब्दों को गिनता है, इसलिए यह मेरे लिए काफी अच्छा है! :-)
अग्सोल

3

wcकार्यक्रम मायने रखता है "शब्दों", लेकिन उन उदाहरण के लिए "शब्द" है कि कई लोगों को जब वे एक फ़ाइल का परीक्षण देखना होगा नहीं हैं। viउदाहरण के लिए कार्यक्रम, "शब्द" का एक अलग उपाय, उन्हें अपने चरित्र वर्गों के आधार पर परिसीमन का उपयोग करता है, जबकि wcबस में गिना जाता है बातें खाली स्थान के द्वारा अलग । दो उपाय मौलिक रूप से भिन्न हो सकते हैं। इस उदाहरण पर विचार करें:

first,second

viतीन शब्दों को देखता है ( पहला और दूसरा और साथ ही कॉमा उन्हें अलग करता है), जबकि एक को wcदेखता है (इस लाइन पर कोई व्हाट्सएप नहीं है)। शब्दों को गिनने के कई तरीके हैं, कुछ दूसरों की तुलना में कम उपयोगी हैं।

जबकि पर्ल vi- शैली के शब्दों के लिए एक काउंटर लिखने के लिए बेहतर होगा, यहाँ एक त्वरित उदाहरण का उपयोग किया गया है sed, trऔर wc(शाब्दिक कैरिज रिटर्न का उपयोग करते हुए मामूली पोर्टेबल ^M):

#!/bin/sh
in_words="[[:alnum:]_]"
in_punct="[][{}\\|:\"';<>,./?\`~!@#$%^&*()+=-]"
sed     -e "s/\($in_words\)\($in_punct\)/\1^M\2/g" \
        -e "s/\($in_punct\)\($in_words\)/\1^M\2/g" \
        -e "s/[[:space:]]/^M/g" \
        "$@" |
tr '\r' '\n' |
sed     -e '/^$/d' |
wc      -l

तुलना करना मायने रखता है:

  • स्क्रिप्ट को स्वयं चलाना, मुझे 76 शब्द देता है।
  • पर्ल में @cuonglm का उदाहरण 31 देता है।
  • उपयोग wc28 देता है।

संदर्भ के लिए, POSIX vi कहते हैं:

POSIX लोकेल में, vi पाँच प्रकार के शब्दों को पहचानेगा:

  1. अक्षरों का एक अधिकतम अनुक्रम, अंक और अंडरस्कोर, दोनों सिरों पर सीमांकित:

    • अक्षर, अंक या अंडरस्कोर के अलावा अन्य वर्ण

    • किसी पंक्ति का आरंभ या अंत

    • संपादन बफ़र की शुरुआत या अंत

  2. अक्षरों, अंकों, अंडरस्कोर, या वर्णों के अलावा वर्णों का एक अधिकतम क्रम, दोनों सिरों पर सीमांकित:

    • एक अक्षर, अंक, अंडरस्कोर
    • <blank> पात्र
    • किसी पंक्ति का आरंभ या अंत
    • संपादन बफ़र की शुरुआत या अंत
  3. एक या अधिक अनुक्रमिक रिक्त लाइनें

  4. संपादन बफ़र में पहला वर्ण

  5. अंतिम गैर- <newline>संपादित बफ़र में

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