मैं एक फ़ाइल में सभी शब्दों की संख्या की गणना करने के लिए एक कमांड की तलाश कर रहा हूं। उदाहरण के लिए यदि कोई फ़ाइल इस प्रकार है,
today is a
good day
तब यह छपना चाहिए 5
, क्योंकि वहां 5
शब्द हैं।
मैं एक फ़ाइल में सभी शब्दों की संख्या की गणना करने के लिए एक कमांड की तलाश कर रहा हूं। उदाहरण के लिए यदि कोई फ़ाइल इस प्रकार है,
today is a
good day
तब यह छपना चाहिए 5
, क्योंकि वहां 5
शब्द हैं।
जवाबों:
आज्ञा 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
wc -w
जीएनयू के लिए के रूप में ही परिभाषा नहीं है grep -w
। के लिए wc
एक शब्द भी एक या अधिक गैर अंतरिक्ष वर्णों का एक क्रम (है [:space:]
वर्तमान स्थान में चरित्र वर्ग)। उदाहरण के लिए foo,bar
और foo bar
(एक गैर-ब्रेकिंग स्पेस के साथ) प्रत्येक एक शब्द है।
मैं इसके लिए बस नंबर के साथ आया:
wc -w [file] | cut -d' ' -f1
5
मुझे भी wc -w < [file]
अप्रोच पसंद है
अंत में, एक चर में केवल शब्द गणना को संग्रहीत करने के लिए, आप निम्नलिखित का उपयोग कर सकते हैं:
myVar=($(wc -w /path/to/file))
इससे आप फ़ाइल नाम को शान से छोड़ सकते हैं।
wc -w < "$file"
बस संख्या के लिए।
बेहतर समाधान पर्ल का उपयोग कर रहा है:
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
।
wc
~ 14sec लिया, जबकि Perl ने ~ 5sec लिया!
split
को छोड़कर /\s+/
एक जैसा है split(' ')
कि कोई भी प्रमुख व्हाट्सएप एक अशक्त पहला क्षेत्र पैदा करता है। वह अंतर आपको प्रति पंक्ति लिंक पर एक अतिरिक्त शब्द (अशक्त प्रथम क्षेत्र, वह है) देगा । तो (split(" ", $_))
इस तरह से बनाई गई फ़ाइल के लिए अन्यथा का उपयोग करें: echo -e "unix\n linux" > testfile
आपका वन-लाइनर 3 शब्दों की रिपोर्ट करता है।
wc
काफी तेज होगा, ठीक उसी तरह PERLIO=:utf8
, जैसे perl
कि काफी धीमा होगा।
$ 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- वार्ड रूबी
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
तुलना करना मायने रखता है:
wc
28 देता है।संदर्भ के लिए, POSIX vi कहते हैं:
POSIX लोकेल में, vi पाँच प्रकार के शब्दों को पहचानेगा:
अक्षरों का एक अधिकतम अनुक्रम, अंक और अंडरस्कोर, दोनों सिरों पर सीमांकित:
अक्षर, अंक या अंडरस्कोर के अलावा अन्य वर्ण
किसी पंक्ति का आरंभ या अंत
संपादन बफ़र की शुरुआत या अंत
अक्षरों, अंकों, अंडरस्कोर, या वर्णों के अलावा वर्णों का एक अधिकतम क्रम, दोनों सिरों पर सीमांकित:
- एक अक्षर, अंक, अंडरस्कोर
<blank>
पात्र- किसी पंक्ति का आरंभ या अंत
- संपादन बफ़र की शुरुआत या अंत
एक या अधिक अनुक्रमिक रिक्त लाइनें
संपादन बफ़र में पहला वर्ण
अंतिम गैर-
<newline>
संपादित बफ़र में
wc -w $FILE
?