2012-05-15 89 views
3

通過單詞,我的意思是任何以空格分隔的字符串。在linux bourne shell中:如何統計文件中特定單詞的出現次數

假設該文件test.txt具有由空格分隔以下的話:

hello hello hello hell osd 
hello 
hello 
hello 
hellojames beroo helloooohellool axnber hello 
way 
how 

我想算的話你好出現在每一行的次數。

我使用的命令awk -F "hello" '{print NF-1}' test.txt以顯示單詞出現的招呼中的每一行數:

3 
1 
1 
1 
4 
0 
0 

所以發現總共3 + 1 + 1 + 1 + 4 = 10次出現。

問題是在第四行:你好只發生1次作爲單獨的單詞;文字如hellojameshelloooohellool不應該被計數,因爲你好不以空格分隔。

所以我想它找到7次出現你好作爲一個單獨的詞。

你能幫我寫一個返回正確總數7次的命令嗎?

+0

你需要出現在數分離每一行,還是隻有總數? –

+0

我只需要總共 – user1304473

回答

6
awk '{ for(i=1; i<=NF; i++) if($i=="hello") c++ } END{ print c }' file.txt 

如果你需要它來打印每行:

awk '{ c=1; for(i=0; i<=NF; i++) if($i=="hello") c++; print c }' 
+0

謝謝它的工作。 – user1304473

+0

其實第三行,在這個「你好」之後,這個hello後面有一個隱藏的空白, 所以當我把它計算出來的時候,hello [space] nextline,這意味着這是一個hello [space]而不僅僅是一個 「你好」字 它的工作原理,謝謝 – user1304473

+0

對不起,一個;領域去1-NF。不知道爲什麼你的第三行關閉,也許你有一個有趣的非打印字符。 – Kevin

0
for word in `cat test.txt`; do 
    if [[ ${word} == hello ]]; then 
    helloCount=$((${helloCount} + 1)); 
    fi; 
done; 

echo ${helloCount} 
+1

UUoC! http://partmaps.org/era/unix/award.html(也UUo $ {}但我還沒有找到一個網站。):-) –

+0

這將無法正常工作。他想要每行*的計數。這複製了'grep -c'的行爲(即每個*文件計數*)。 –

+0

@AdamLiss這不是一個UUoC。 for循環正常工作需要Cat。他本質上是想要讀取文件爲stout,你的鏈接明確指出的是貓的有效使用。 –

0
a=$(printf "\01") 
b=hello 
sed -e "s/\<$b\>/ $a /g" -e "s/[^$a]//g" -e "s/$a/ $b /g" file | wc -w 
2

解決方案:

sed 's/\s\+/\n/g' test.txt | grep -w hello | wc -l 

說明:

sed 's/\s\+/\n/g' text.txt 

這將替換空白的每一個跨度換行符,有效地重新格式化文件test.txt所以它具有每行一個字。命令sed 's/FIND/REPLACE/g'REPLACE替代FIND模式。 \s\+表示「一個或多個空白字符」,而\n是換行符。

grep -w hello 

這僅提取那些包含hello作爲一個完整的字線。

wc -l 

這可以計算行數。


如果你要計算每行出現的次數,你可以使用相同的技術,但處理的一行,時間:

while read line; do 
    echo $line | sed 's/\s\+/\n/g' | grep -w hello | wc -l 
done < test.txt 
3
grep -o '\<hello\>' filename | wc -l 

\<\>位字邊界模式,所以表達式不會找到foohellohellobar。您可以使用awk -F '\\<hello\\>' ...來達到同樣的效果。

+0

這很有效,謝謝 – user1304473

0
cat $FileName | tr '[\040]' '[\012]' | grep $word | wc -l 

這個命令會改變空格在新行,然後很容易你可以grep那個單詞和計數包含給定單詞的行數。

0

只有改變「針」和「文件」

#!/usr/bin/env sh 

needle="|" 
file="file_example.txt" 

IFS=$'\n' 

counter=0 
for line in `cat $file` 
do 
    counter=$[$counter+1] 
    echo $counter"|"`echo $line | grep -o "$needle" | wc -l` 
done 

這將打印行數和出現的次數,由管道字符

相關問題