awk正規表現を使用してファイルの一致を計算して合計したいと思います。
このファイルfile
には以下が含まれます。
Gra pes
gra ndma
straw berry
blue Berry
banana
peanut
school
パターンマッチングのための正規表現を作成する必要がありますが、どうすればよいかわかりません。そして/または正規表現では優先順位は同じですが、
私は試した:
awk 'tolower($1) ~ /(gra|straw) (pes|berry)|banana|peanut/ {sum+=1} END {print sum+0}' file
したがって、そのうちの1つでなければならず、(gra pes, gra berry, straw pes, straw berry) OR banana, peanut
4つの一致があるため、4を返す必要があります。
私の構文に問題があるとします。またはバナナピーナッツですが、どのように修正するのかわかりません。
何が起こっているのかというアイデアはありますか?ありがとう
ベストアンサー1
正規表現は大丈夫です。あなたの問題は、あなたがtolower($1)
それを一致させているということです最初のフィールド(スペースで区切り、デフォルトFS
)を小文字に変換します。
たとえば、最初の行(Gra pes
)は正規表現と一致し、gra
失敗します。
完全な記録には以下が必要です$0
。
awk 'tolower($0) ~ /regexp/ ...'
また、デフォルトでは正規表現は固定されていないため、たとえば、次に見つかったpeanutbutter
インスタンスと一致します。peanut
入力レコードを正規表現で完全に一致させるには、次の手順を実行する必要があります。
awk 'tolower($0) ~ /^(foo|bar)$/'
どちらが一致するのかトピックの始まり(^
)の後にfoo
、またはbar
次のいずれかが続きます。トピックの終わり($
)。ここでは括弧が重要です。 (開始から)または(終了から)に^foo|bar$
することができますので、一致するか、たとえば。^foo
foo
bar$
bar
fooX
Ybar