2015-02-20 6 views
5

का उपयोग कर गणना मैं नीचे की तरह फ़ाइल है:वर्ड AWK

यह एक नमूना फ़ाइल इस फाइल

this is a sample file 
this file will be used for testing 

के परीक्षण के लिए इस्तेमाल किया जाएगा मैं AWK का उपयोग कर शब्द गणना करना चाहते हैं।

उम्मीद उत्पादन

this 2 
is 1 
a 1 
sample 1 
file 2 
will 1 
be 1 
used 1 
for 1 

AWK नीचे मैं लिखा है है, लेकिन कुछ त्रुटियाँ हो रही

cat anyfile.txt|awk -F" "'{for(i=1;i<=NF;i++) a[$i]++} END {for(k in a) print k,a[k]}' 
+2

क्या त्रुटियों आप मिल रहा है, विशेष रूप से? –

+0

क्या आपकी फ़ाइल में विराम चिह्न ('।, '?! -' आदि) हो सकता है? –

उत्तर

6

यह मेरे लिए ठीक काम करता है:

awk '{for(i=1;i<=NF;i++) a[$i]++} END {for(k in a) print k,a[k]}' testfile 
used 1 
this 2 
be 1 
a 1 
for 1 
testing 1 
file 2 
will 1 
sample 1 
is 1 

पुनश्च आप की जरूरत नहीं है -F" " सेट करने के लिए, क्योंकि यह डिफ़ॉल्ट रूप से किसी भी खाली है।
पीएस 2, प्रोग्राम हैं जो डेटा अपने आप पढ़ सकते हैं साथ cat का उपयोग नहीं करते, जैसे awk

आप इसे सुलझाने के लिए कोड के पीछे sort जोड़ सकते हैं।

awk '{for(i=1;i<=NF;i++) a[$i]++} END {for(k in a) print k,a[k]}' testfile | sort -k 2 -n 
a 1 
be 1 
for 1 
is 1 
sample 1 
testing 1 
used 1 
will 1 
file 2 
this 2 
+0

यह फ़ील्ड विभाजक विकल्प को हटाने के बाद काम करता है। लेकिन मुझे यह नहीं मिला कि -एफ "" क्या समस्या पैदा कर रही थी? क्या आप कृपया –

+0

को समझने में मेरी सहायता कर सकते हैं, मुझे लगता है कि आपके मूल इनपुट में दो स्तंभों के बीच एक अलग संख्या या व्हाइटस्पेस वर्ण हैं।अजीब का डिफ़ॉल्ट व्यवहार किसी भी प्रकार की किसी भी प्रकार की जगह के साथ काम करना है, जबकि आपने केवल एक ही स्थान निर्दिष्ट किया है। –

+1

@ टॉमफेनेच एक एकल स्थान निर्दिष्ट करने से शून्य में शून्य अंतर आएगा क्योंकि यह एफएस का डिफ़ॉल्ट मान है, यह केवल आंतरिक रूप से अजीब व्यवहार करता है यदि एफएस एक ही स्थान है। एक लिटिलल सिंगल स्पेस के लिए आपको 'एफएस = "[]" 'की आवश्यकता है। –

1
इसके बजाय प्रत्येक पंक्ति पाशन और सरणी में शब्द ( {for(i=1;i<=NF;i++) a[$i]++}) को बचाने के

बहु चार रुपये (आर ecord एस eparator) परिभाषा समर्थन विकल्प के साथ gawk का उपयोग करें और (निम्नलिखित के रूप में सरणी में प्रत्येक क्षेत्र को बचाने के यह एक छोटा सा तेजी से):

gawk '{a[$0]++} END{for (k in a) print k,a[k]}' RS='[[:space:]]+' file 

आउटपुट:

used 1 
this 2 
be 1 
a 1 
for 1 
testing 1 
file 2 
will 1 
sample 1 
is 1 

ऊपर gawk कमांड में मैं स्पेस-कैरेक्टर-क्लास [[:space:]]+ (एक या अधिक रिक्त स्थान या \n ईड लाइन वर्ण सहित) को रिकॉर्ड विभाजक के रूप में परिभाषित करता है।

perl -ne 'for (split /\s+/, $_){ $w{$_}++ }; END{ for $key (sort keys %w) { print "$key $w{$key}\n"}}' testfile

$_ वर्तमान पंक्ति है, जो खाली स्थान के /\s+/
के आधार पर प्रत्येक शब्द तो $_
में डाल दिया है विभाजित है:

+0

अच्छा विचार है लेकिन आपको यह कहना चाहिए कि यह बहु-चार आरएस के कारण गॉक-विशिष्ट है और आपको केवल उन 2 स्पेस वर्णों को हार्ड-कोडिंग के बजाय 'आरएस =' [[: space:]] + 'का उपयोग करना चाहिए। –

+1

आपका स्वागत है। आपको '| \ n' की आवश्यकता नहीं है, हालांकि' [[: space:]] '' \ n' सहित सभी सफेद स्पेस वर्णों का प्रतिनिधित्व करता है। –

+1

अपडेट किया गया। एक बार फिर धन्यवाद। अगर मुझे कुछ याद आती है तो सुधारने में संकोच न करें :) –

-1

यहाँ पर्ल कोड जो Jotne के awk समाधान के समान क्रमबद्ध आउटपुट प्रदान करता है %w हैश प्रत्येक शब्द
की घटनाओं की संख्या को संग्रहीत करता है पूरी फ़ाइल संसाधित होने के बाद, END{} ब्लॉक चलाया जाता है
%w हैश की चाबी वर्णानुक्रम
प्रत्येक शब्द $key हल कर रहे हैं और घटनाओं $w{$key} की संख्या छपा है