web-dev-qa-db-ja.com

Bashを使用して文字列内の文字の出現をカウントする

Bashを使用して、文字列内の文字の出現回数をカウントする必要があります。

次の例では、charが(たとえば)tの場合、それはechostでのvarの正しい出現回数ですが、文字がコンマまたはセミコロンの場合、ゼロを出力します。

var = "text,text,text,text" 
num = `expr match $var [,]`
echo "$num"
97
Jericob

次のawkコマンドを使用します。

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

文字列を$charで分割し、結果のフィールドの数から1を引いた値を出力します。

シェルが<<<演算子をサポートしていない場合は、echoを使用します。

echo "${string}" | awk -F"${char}" '{print NF-1}'
95
hek2mgl

たとえば、次のように、他のすべての文字を削除して、残っているものをカウントできます。

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"
89
jm666

trコマンドとwcコマンドを組み合わせて実行できます。たとえば、文字列erefereeをカウントするには

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

出力

4

説明:コマンドtr -cd 'e'は「e」以外のすべての文字を削除し、コマンドwc -cは残りの文字をカウントします。

このソリューションには、コマンドcat mytext.txt | tr -cd 'e' | wc -cがファイルmytext.txt内のeをカウントできるなど、複数行の入力も適しています。

46
Robin Hsu

サーバーにある場合、awkはうまく機能します。

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

みんなの素晴らしい回答とコメントを基に、これは最短で最も甘いバージョンです:

grep -o "$needle" <<< "$haystack" | wc -l

1
rmanna

私は以下を提案します:

var="any given string"
N=${#var}
G=${var//g/}
G=${#G}
(( G = N - G ))
echo "$G"

他のプログラムへの呼び出しはありません

0
Mathew P V