awkプログラムでANDとORを一緒に使用する方法は?

awkプログラムでANDとORを一緒に使用する方法は?

たとえば、2つの列を持つファイルがあります。

$ cat data
a4 b1
a4 c2
a4 b4
z4 c2

2つの列を一致させたい。たとえば、(column1 = a4 and column2 = b1)OR(column1 = a4 and column2 = c2) の場合、列3の出力は次のようになります。

(希望出力):

a4 b1 matched
a4 c2 matched
a4 b4 -
z4 c2 -

だから私のロジックを1liner awkにマージしようとしました。

$ awk '{print $1, $2, (($1 = a4 && $2 = b1) || ($1 = a4 && $2 = c2) ? "a4-matched" : "-")}' data

3番目の列全体でawkの構文が間違っているか、他のものが欠落しているようです。結果は次のとおりです。

a4 b1 -
a4 c2 -
a4 b4 -
z4 c2 -

ベストアンサー1

ほぼすべて来ましたが、構文エラーが発生したようです。$1=a4最初の列が同じであることを確認する代わりに、a4変数の内容(定義されていないため空)を最初の列に割り当ててその内容を上書きします。 (あなたが気づかないように印刷したもの)また、初期化されていない変数は「false」と評価されるため、「false」と評価されます。他の比較でも同様です。これが「一致」条件を「真」として扱わない理由です。awka4

(マイナー)必要な修正を終えた後、プログラムは次のようになります。

awk '{if (($1=="a4" && $2=="b1") || ($1=="a4" && $2=="c2")) $3="matched"; else $3="-"} 1' data.txt 

仕組みは次のとおりです。

  • 各行について述べた条件が満たされていることを確認し、第三$3またはに設定して-列から行に移動しますmatched
  • 次に、修正を含む現在の行を印刷します。これはさまよう1ルールブロックの外側 -awkルール外で「true」と評価される条件が見つかると、以前の修正を含む現在の行が印刷されます。

上記のプログラムは、理解を容易にし、それを示すために明示的に書かれています。 「許可された」両方のケースで条件が$1同じであるため、あなたの場合は短縮される可能性があります$2

awk '{if ($1=="a4" && ($2=="b1" || $2=="c2")) $3="matched"; else $3="-"} 1' data.txt

awkまた、フィールドを変更すると、出力フィールド区切り文字(デフォルトは1つの空白)を使用して個々のフィールドで行が再作成されるため、入力フィールドを複数のスペースで区切ると元の書式が削除されます。これが問題の場合は、代わりに印刷する必要がありますが、すでに選択した「追加」戦略を採用する必要があります。$0, ( your conditional string )$1, $2, ( your conditional string )

おすすめ記事