2010-10-19 7 views
16

मैं इनपुट फ़ाइल में अंग्रेजी वर्णमाला में प्रत्येक अक्षर की उपस्थिति की आवृत्ति को जानने का प्रयास कर रहा हूं। मैं इसे बैश स्क्रिप्ट में कैसे कर सकता हूं?फ़ाइल में प्रत्येक पत्र की आवृत्ति को खोजने के लिए बैश स्क्रिप्ट

+0

आप इसके लिए बैश का उपयोग क्यों कर रहे हैं? –

+0

कहीं भी इस प्रोग्रामिंग सवाल मिला !! मुझे लगता है कि पर्ल बेहतर विकल्प होगा, है ना? – SkypeMeSM

उत्तर

11

बस एक awk आदेश

awk -vFS="" '{for(i=1;i<=NF;i++)w[$i]++}END{for(i in w) print i,w[i]}' file 

अगर आप केस संवेदी चाहते हैं, tolower()

awk -vFS="" '{for(i=1;i<=NF;i++)w[tolower($i)]++}END{for(i in w) print i,w[i]}' file 

जोड़ सकते हैं और आप केवल पात्रों चाहते हैं,

awk -vFS="" '{for(i=1;i<=NF;i++){ if($i~/[a-zA-Z]/) { w[tolower($i)]++} } }END{for(i in w) print i,w[i]}' file 

और अगर आप केवल अंक चाहते हैं, /[0-9]/

को /[a-zA-Z]/ बदल अगर आप यूनिकोड को दिखाने के लिए नहीं करना चाहते, कर export LC_ALL=C

+0

आपके उत्तर के लिए धन्यवाद। – SkypeMeSM

+0

मुझे खेद है कि मैं अजीब से बहुत परिचित नहीं हूं। समाधान काम करता है लेकिन मुझे केवल अल्फान्यूमेरिक वर्णों के बजाय सभी वर्ण मिल रहे हैं। awk -vFS = "" '{के लिए (i = 1; i <= एनएफ; i ++) w [tolower ($ i)] ++ sum ++} END {के लिए (i w में) प्रिंट I, w [i], w [i]/sum} ' – SkypeMeSM

+0

फिर से धन्यवाद। मैं सोच रहा हूं कि मुझे ü 2 और é 2 जैसे परिणाम क्यों मिलते हैं, जब रेगेक्स [ए-जेए-जेड] होता है। – SkypeMeSM

2

यहाँ एक सुझाव है:

while read -n 1 c 
do 
    echo "$c" 
done < "$INPUT_FILE" | grep '[[:alpha:]]' | sort | uniq -c | sort -nr 
+0

उत्तर देने के लिए धन्यवाद। – SkypeMeSM

6

sed, sort और uniq के साथ एक समाधान:

sed 's/\(.\)/\1\n/g' file | sort | uniq -c 

यह सभी पात्रों की गणना करता है, न केवल अक्षरों। आप के साथ बाहर फ़िल्टर कर सकते हैं:

sed 's/\(.\)/\1\n/g' file | grep '[A-Za-z]' | sort | uniq -c 

आप अपरकेस और एक ही रूप में लोअरकेस विचार करने के लिए, बस एक अनुवाद जोड़ने चाहते हैं:

sed 's/\(.\)/\1\n/g' file | tr '[:upper:]' '[:lower:]' | grep '[a-z]' | sort | uniq -c 
+0

धन्यवाद के साथ काम नहीं कर रहा है।यह अपरकेस और लोअरकेस अक्षरों को अलग मानता है। मैं उन आवृत्तियों की गणना कैसे कर सकता हूं जहां हम ए और एक जैसा मानते हैं? – SkypeMeSM

+0

हां यह भी अच्छा काम करता है। मैं सोच रहा हूं कि मैं संभावनाओं की गणना कैसे कर सकता हूं यानी आवृत्ति/कुल योग। हमें आउटपुट को दोबारा फिर से पाइप करने की आवश्यकता होगी, लेकिन मैं शामिल रेगेक्स को समझ नहीं सकता? – SkypeMeSM

+0

आप कुछ 'wc', 'cut',' dc', 'tee' और अन्य कमांड जोड़ सकते हैं लेकिन यह एक रखरखाव कार्य की तुलना में प्लेटों के साथ अधिक जुगलिंग होगा। मुझे लगता है कि एक पर्ल स्क्रिप्ट के साथ और अधिक सुविधाएं जोड़ना आसान होगा। – mouviciel

19

grep, sort और uniq का उपयोग कर मेरे समाधान।

grep -o . file | sort | uniq -c 

मामले पर ध्यान न दें:

grep -o . file | sort -f | uniq -ic 
+0

इसके बाद मैं आवृत्ति/योग (सभी आवृत्तियों) कैसे प्राप्त कर सकता हूं? – SkypeMeSM

+0

यह मैक के टर्मिनल के साथ काम करता है। प्रत्येक चरित्र की आवृत्ति प्राप्त करने के लिए –

+0

@ स्काइपएमईएसएम, केवल वर्णों की कुल संख्या (जिसे 'wc -c फ़ाइल' द्वारा दिया गया है) से विभाजित करें। –

0

mouviciel करने के ऊपर का जवाब ही तरह, लेकिन बीएसडी प्रणाली, जब आप जीएनयू, SED नहीं है पर इस्तेमाल किया बॉर्न और कॉर्न के गोले के लिए अधिक सामान्य है, जिसमें \ N का समर्थन करता है

sed -e's/./&\ 
/g' file | sort | uniq -c | sort -nr 

या स्क्रीन पर दृश्य विभाजन से बचने के लिए, द्वारा CTRL + V Ctrl + जम्मू

एक शाब्दिक न्यू लाइन डालने: एक प्रतिस्थापन, तो आप एक नई पंक्ति बच बैकस्लैश कर सकते हैं 210
sed -e's/./&\^J/g' file | sort | uniq -c | sort -nr 
संबंधित मुद्दे