2015-04-14 47 views
1

假設您有幾個文本文件,並且您想要查看哪些文本包含單詞'the'的頻率。第一個想法似乎是使用grep-c選項:我可以讓grep返回幾個文件中的真實發生次數嗎?

$ grep -Hciw 'the' * 

不幸的是,這給了錯誤的計數,因爲它計算字每行只有一次,而不管「的」實際有多少實例在線。

對於一個單一的文件,我可以組合使用選項-owc得到匹配的字符串

$ grep -owi 'the' file.txt | wc -l 

但如果我更換file.txt有星號或一個文件列表,我只獲取累計的點擊次數,而不是每個文件的點擊次數。

到目前爲止,我已經找到了最好的方法是一個循環:

for f in *; do 
    num=$(grep -oiw 'the' $f | wc -l); 
    echo ${f}:${num}; 
done 

但是,這真的是最好的方法是什麼?

+1

工作,你可能會使文件的預處理副本'TR「」「\ n''把每一個字佔據一行...可能儘管使用'awk'更好。 – o11c

+0

所有三個答案都很好,而且截然不同。最後,我決定和@Jotne一起去,因爲他不需要一個管道。但是,三者都值得理解。 – chw21

回答

2

這裏是AA的方式與gnu awk(GNU做到這一點,由於多個字符在RS中)

awk -v RS=" |\n" '/\<[Tt]he\>/ {a[FILENAME]++} END {for (i in a) print i,a[i]}' * 

它將打印結果是這樣的:

file1 22 
file3 4 

它計算的話the的數量並將其存儲在使用文件所指的名稱的數組。


這應與所有awk

awk '{for (i=1;i<=NF;i++) if (tolower($i)~/^the[.,?]*$/) a[FILENAME]++} END {for (i in a) print i,a[i]}' * 
+0

看起來不錯,但'the'似乎區分大小寫,所以如果'The'是句子的第一個單詞,它不會被計算。 – chw21

+0

@ chw21可以通過修改'$ i ==「來修復」'to'tolower($ i)==「」或'/ \ <[Tt]he\> /'' – Jotne

1

請您嘗試下面的命令,讓我知道你是否面臨任何困難。

$ find . -name \*.txt | xargs -I {} sh -c 'echo {}; grep -oiw 'the' {} | wc -l' 

通過這個命令的輸出會在下面的格式:

./file-1.txt 
4 
./file-2.txt 
4 
1

使用awk

grep -Hoiw 'the' * |awk -F\: '{a[$1]++}END{for (i in a){print i":"a[i]}}' 
+0

將'c'替換爲'o',它可以工作。謝謝。 – chw21

+0

Opss ... typo;) – klashxx

相關問題