たとえば、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」と評価されます。他の比較でも同様です。これが「一致」条件を「真」として扱わない理由です。awk
a4
(マイナー)必要な修正を終えた後、プログラムは次のようになります。
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 )