awk ワンライナーを、一致する列のペア (行ごと) の識別から複数の列の識別に拡張する

awk ワンライナーを、一致する列のペア (行ごと) の識別から複数の列の識別に拡張する

私は Win7 と Cygwin を使用しています。列のペアの一致を識別するために機能するワンライナーがありますが、追加の列 (つまり、2 を超える列) を導入しようとすると、機能しません。そのため、次のコードが機能します。

gawk -F "^" '{ if ($3 == $7) print "0"; else print $3,$7; }' infile.txt > outfile.txt

しかし、別の列のペアを追加すると、構文エラーが発生します。

gawk -F "^" '{ if ($3 == $7 || $3 == $11) print "0"; else print $3,$7,$11; }' infile.txt > outfile.txt

コマンドに何か問題があるようですが、エラー メッセージは私にとってあまり役に立ちません。「||」の代わりに「&&」を使用すると、エラーも発生します (最初の「$7」の直後に「予期しない改行または文字列の終わり」、および「$3 は内部コマンドまたは外部コマンド、操作可能なプログラム、またはバッチ ファイルとして認識されません」)。

次に、列区切り文字として「^」を含む 3 つの行を含む入力ファイルの例を示します。

paris^london^new york^paris^rome^paris

paris^london^munich^paris^rome^paris

paris^london^munich^berlin^rome^paris

ファイルの各行で、列 1、4、および 6 が互いに一致するかどうかを確認できるようにしたいです。この場合、行 1 は「はい」、行 2 は「はい」、行 3 は「いいえ」です。したがって、出力には「はい」の場合は「0」、または「いいえ」の場合は行全体を繰り返す必要があります。したがって、出力は次のようになります。

0
0
paris^london^munich^berlin^rome^paris

何か案は ?

答え1

避け||&&

  • &&テスト用

    gawk -F "^" '$3 == $7{if($3 == $11){print "0"; next;}}{print $3,$7,$11}'

  • ||テスト用

    gawk -F "^" '$3 == $7{print "0"; next;}$3 == $11{print "0"; next;}{print $3,$7,$11}'

答え2

ようやく分かりました。Win7 で Cygwin を使用しています。一重引用符はダメだったので、すべての一重引用符を二重引用符に置き換えると構文が修正されました。さらに、「||」はダメでしたが、「&&」は問題なく動作します。したがって、次のようになります。

gawk -F "^" "{ if ($1 == $2 && $3 == $4 && $4 == $5 && $5 == $6) print 0; else print $1,$2,$3; }" infile.txt > outfile.txt

関連情報