सभी शब्दों और प्रिंट आउटपुट की छँटाई की गई टेक्स्ट-फाइल शब्द घटना गिनती प्राप्त करें


28

मेरे पास एक कमांड थी जो एक टेक्स्ट फ़ाइल के माध्यम से काम करेगी, शब्दों की सभी घटनाओं को गिनेंगी और इसे इस तरह प्रिंट करेंगी:

user@box $˜ magic-command-i-forgot | with grep | and awk | sort ./textfile.txt
66: the
54: and
32: I
16: unix
12: bash
5:  internet
3:  sh
1: GNU/Linux

तो यह लाइन-बाय-लाइन नहीं, बल्कि शब्द से शब्द खोजता है, और यह इसे केवल 1 शब्द के लिए नहीं, सभी शब्दों के लिए करता है। मैं एक लंबे समय से पहले नजरबंद पर कहीं मिल गया था, लेकिन मैं इसे खोजने या याद नहीं कर सकता ..

जवाबों:


33

मैं awk केtr बजाय उपयोग करूँगा :

echo "Lorem ipsum dolor sit sit amet et cetera." | tr '[:space:]' '[\n*]' | grep -v "^\s*$" | sort | uniq -c | sort -bnr
  • tr बस नई जगह के साथ रिक्त स्थान की जगह
  • grep -v "^\s*$" ट्रिम खाली लाइनों
  • sort के लिए इनपुट के रूप में तैयार करने के लिए uniq
  • uniq -c घटनाओं को गिनने के लिए
  • sort -bnr व्हॉट्सएप को नजरअंदाज करते हुए संख्यात्मक उल्टे क्रम में सॉर्ट करें

वाह। यह शपथ-प्रति-पंक्तियों की गणना करने के लिए एक महान आदेश निकला

खोजो। -name "* .py" -exec बिल्ली {} \; | tr '[: space:]' '[\ n *]' | grep -v "^ \ _ * $" | सॉर्ट | uniq -c | सॉर्ट -बांर | चुदाई की चुदाई


tr -sकई स्थानों को संभालने के लिए उपयोग करना चाह सकते हैं , खासकर जब इंडेंटेशन का सामना कर रहे हों।
Arcege करें

@Arcege: अच्छी बात है। यद्यपि यह अभ्यस्त परिणाम को बदल देता है लेकिन यह स्क्रिप्ट को थोड़ा बढ़ा सकता है।
सेलेर

-g( कुछ मामलों में --general-numeric-sort) का विकल्प sortबेहतर हो सकता है। जैसे है वैसे sort -nही रखेंगे 10\n1 4, 1 4जैसा इलाज कर रहे हैं 14, वैसे ही sort -gइसका सही इलाज करेंगे 1 4\n10
स्किपी ले ग्रांड गौरौ सेप

अच्छा आदेश, वास्तव में एक वोट के पात्र :)
नूर

@ मुझे लगता है कि आप नीचे की तरह grep और tr भाग को भी सरल बना सकते हैं: echo "Lorem ipsum dolor sit sit amet et cetera." | tr ' ' '\n' | grep -v "^$" | sort | uniq -c | sort -bnrध्यान दें कि मैं एक शुरुआती हूं, इसलिए मैं गलत हो सकता हूं, कृपया सलाह देने के लिए स्वतंत्र महसूस करें।
एसएमसी

8
  1. इनपुट को शब्दों में विभाजित करें, प्रति पंक्ति एक।
  2. शब्दों (लाइनों) की परिणामी सूची को क्रमबद्ध करें।
  3. कई घटनाएँ स्क्वैश।
  4. घटना क्रम से क्रमबद्ध करें।

इनपुट को शब्दों में विभाजित करने के लिए, किसी भी वर्ण को बदलें जिसे आप एक शब्द विभाजक के रूप में एक नई पंक्ति से समझते हैं।

<input_file \
tr -sc '[:alpha:]' '[\n*]' | # Add digits, -, ', ... if you consider
                             # them word constituents
sort |
uniq -c |
sort -nr

यह एक अच्छा जवाब है क्योंकि यह उस मामले को संभाल सकता है जहां शब्द सीधे कुछ गैर-शब्द विराम चिह्न के बगल में हैं जिन्हें आप अनदेखा करना चाहते हैं।
डेविड ग्रेसन

5

Grep और awk का उपयोग नहीं कर रहा है, लेकिन यह वही करता है जो आप चाहते हैं:

for w in `cat maxwell.txt`; do echo $w; done|sort|uniq -c
  2 a
  1 A
  1 an
  1 command
  1 considered
  1 domain-specific
  1 for
  1 interpreter,
  2 is
  1 language.
  1 line
  1 of

1
यह काम नहीं करेगा यदि इनपुट में शेल वाइल्डकार्ड (आपको जोड़ने की आवश्यकता है set -f), और शब्दों के हिस्से के रूप में विराम चिह्न का व्यवहार करता है (जो विस्मयकारी वर्णों को जोड़कर IFS- अशिक्षित चरित्र सेट का समर्थन करने की कोशिश करने वाले सौभाग्य को तय कर सकता है )। यह बहुत बड़ी इनपुट फ़ाइलों के साथ अच्छा नहीं होगा, क्योंकि यह पूरी फ़ाइल को मेमोरी में संग्रहीत करता है ( sortयह स्मार्ट है)।
गिल्स एसओ- बुराई को रोकें '21

2

मेरा मानना ​​है कि आप इस तरह से कुछ के बाद कर रहे हैं?

$ perl -n -e 'foreach ${k} (split(/\s+/)){++$h{$k}};END{foreach $l (keys(%h)){print "$h{$l}: ${l}\n"}}' /path/to/your/file | sort -n -k 1

बेशक आप के साथ भी ऐसा ही कर सकते हैं awk:)



0
file=/home/stefan/ooxml1.txt
for word in $(sed 's/[^A-Za-z]/ /g' $file | tr " " "\n" | sort -u)
do
  echo -n "$word "
  grep -c $word $file
done | sort -k2 -n 

शब्दों में फ़ाइल को विभाजित करने के बाद आरोही प्रकार।

सरल ग्रेप मिलेगा fishमें fisheyeहै, तो आप आंशिक मिलान को रोकने के लिए ग्रेप आदेश को बढ़ाने के लिए किया है।

उम्र में एक मशीन पर 25k पाठ फ़ाइल के लिए लगभग 3s लेता है, शास्त्रीय HDD (IDE)।

बड़ी फ़ाइलों के लिए या अक्सर ऑपरेशन किए जाने वाले हैश मैप दृष्टिकोण बेहतर होगा, लेकिन शायद ही कभी नौकरी या छोटी फ़ाइलों के लिए, यह पर्याप्त हो सकता है।

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