2013-05-21 53 views
62

我需要使用Bash計算字符串中char出現次數的次數。使用Bash計算字符串中char的出現次數

在下面的示例中,當字符是(例如)t,它echo小號var正確數量的t出現,但是當字符是逗號或分號,它打印出零:

var = "text,text,text,text" 
num = `expr match $var [,]` 
echo "$num" 
+0

http://unix.stackexchange。com/questions/18736 /如何計算每行特定字符數 –

回答

66

我會用下面的命令awk

string="text,text,text,text" 
char="," 
awk -F"${char}" '{print NF-1}' <<< "${string}" 

我被分割字符串並打印造成的字段數減1

如果你的shell不支持<<<操作,使用echo

echo "${string}" | awk -F"${char}" '{print NF-1}' 
+0

如果var是包含文本的文件,該怎麼辦?上面怎麼能改變這個? – HattrickNZ

+0

@HattrickNZ然後使用:'$(grep -o「$ needle」 hek2mgl

+0

@ hek2mgi。但是這個輸出3?!當我回聲「number_of_occurences」 – Amir

68

例如,你可以刪除所有其他字符和算什麼依然存在,像:

var="text,text,text,text" 
res="${var//[^,]}" 
echo "$res" 
echo "${#res}" 

將打印

,,, 
3 

tr -dc ',' <<<"$var" | awk '{ print length; }' 

tr -dc ',' <<<"$var" | wc -c #works, but i don't like wc.. ;) 

awk -F, '{print NF-1}' <<<"$var" 

grep -o ',' <<<"$var" | grep -c . 

perl -nle 'print s/,//g' <<<"$var" 
+1

[更多技巧](http://www.cyberciti.biz/faq/unix-linux-appleosx-bsd-bash-count-characters-variables/)like'y =「$ {x // [^ s | S]}「;回聲「$ {#y}」' –

+4

使用第一個,應該總是避免使用另一個進程來執行這樣的工作,它會在使用大型迭代循環時嚴重影響性能。作爲規則,當使用迭代或重複操作時,外部流程執行應該是最後的手段。 – osirisgothra

+0

你爲什麼不喜歡'wc'?它是高爾夫球! –

1

awk的效果很好,如果你的服務器有它

var="text,text,text,text" 
num=$(echo "${var}" | awk -F, '{print NF-1}') 
echo "${num}" 
15

您可以通過合併trwc命令去做。例如,將字符串referee

echo "referee" | tr -cd 'e' | wc -c 

輸出

4 

說明在數e:命令tr -cd 'e'刪除不是 'E' 以外的所有字符,命令wc -c計算剩餘的字符。

多行輸入也適用於此解決方案,如命令cat mytext.txt | tr -cd 'e' | wc -c可以在文件mytext.txt中計數e,甚至認爲該文件可能包含很多行。

+0

您的解決方案似乎是最乾淨和最容易記住的,謝謝! – jirislav

相關問題