「bar」で始まり、「i」または「n」で終わる6文字の単語の数を数えたいです。
たとえば、次のファイルが提供されます。
barxxi
barxxc
barxxn
barqwq
barovo
次の行が一致するため、出力は2(整数)でなければなりません。
barxxi
barxxn
私のコードは次のとおりですが、間違っているようです。
grep -c 'bar??[ni]' /path/file.txt
答え1
grep -o
必要に応じて、一致するテキストのみを1行に複数回出力するには、このオプションを使用します。
grep -o '\<bar[^ ][^ ][ni]\>' /path/file.txt | wc -w
単語の始まりと終わりを\<
一致させます。空白以外の文字と\>
一致します。[^ ]
答え2
疑問符を?
ピリオドに置き換えると、.
入力に1行に単語が1つしかない限り、grepが機能します。
grep -c 'bar..[ni]' /path/file.txt
答え3
awk '{ for (i=1;i<=NF;i++) if ($i ~ /^bar.*[in]/ || $i ~ /[[:space:]]bar.*[in]/) { count++ }} END { print count }' filename
上記のawkソリューションも動作します。各行の複数の項目を考慮してパターンが〜を含む正規表現と一致すると、awkはファイルの各行でスペースで区切られた最初の項目から最後の項目(NF)まで見つけ、それに応じて数を増やします。行の先頭(^)と、バー、スペース、バーを考慮する2つのifステートメントを作成します。最後に、カウントが画面に印刷されます。