同じ行にパターンが表示される回数を計算します。

同じ行にパターンが表示される回数を計算します。

この問題はシェルスクリプトで解決する必要があります。以下の文字列の発生回数を数えていますが、abc私が望む答えは3です。

echo abcsdabcsdabc | grep -o abc  
abc  
abc  
abc  

-oオプションがないと仮定すると、どのように処理するgrep必要がありますか?

ベストアンサー1

文字列は次の区切りフィールドで構成されていると思いますabc

$ echo abcsdabcsdabc | awk -F 'abc' '{ print (length > 0 ? NF - 1 : 0) }'
3

区切り文字の発生回数は、abc1 から区切り文字が区切られたフィールドの数を引いたものです。

$ echo abcsdabcsdabc | awk '{ n=0; while (sub("abc", "xxx")) n++; print n }'
3

abcその後、その行の部分文字列が置き換えられ、xxx完了した回数が計算され、その数が出力されます。n=0入力行が1行だけの場合は必要ありません。

gsub()の関数はawk置換回数を返すので、上記の内容は次のように単純化できます。

$ echo abcsdabcsdabc | awk '{ print gsub("abc", "xxx") }'
3

では、bashこのプログラムで行ったのと同じことができます。awksub()

string=abcsdabcsdabc

n=0
while [[ $string == *abc* ]]; do
    n=$(( n+1 ))
    string=${string/abc/xxx}  # replace first occurrence of "abc" with "xxx"
done
printf '%d\n' "$n"

whileこれは、上記の2番目のプログラムと同様に、inが見つからなくなるまでループを使用してin値の部分文字列を置き換えます。abc$stringxxxabc$stringawk

おすすめ記事