awkを使って変数を複数の値に設定するには?

awkを使って変数を複数の値に設定するには?

次のようなファイルがあります。

x 0
1 x
1 1

私は本質的に各行の2つのフィールドが互いに等しいことを確認したいと思います。しかし、問題は、このファイルに保存できる値が含まれていることです。x- しかし、設定方法がわかりません。01awk

次のコードを試しましたが、うまくいきません。どちらか一方にx設定するか、どちらも設定していない場合にのみ機能します。01

y=$(seq 1 2)
awk -v x="$y" '{ if ($1==$2) print "good" }' file

説明が必要な場合はお知らせください。ありがとうございます。

ベストアンサー1

私が知っている一般的なプログラミング言語では、変数を複数の値に設定することはできませんが、変数を使用して値のセットを繰り返すことはできます。

awk各値に対して実行されるコードの周りにシェルループを構築しますx

for x in 0 1; do
    printf 'Running with x=%d\n' "$x"
    awk -v x="$x" \
        '$1 == "x" { $1 = x }
         $2 == "x" { $2 = x }
         $1 == $2  { printf("match on line %d: %d == %d\n", NR, $1, $2) }' file.in
done

コードawkは2つの列の文字をテストし、xtrueの場合は変数の現在の値(コマンドラインで設定)に設定します。awkx

次の列が同じ場合、いくつかの出力が生成されます。

与えられたデータに基づいて出力を生成します。

Running with x=0
match on line 1: 0 == 0
match on line 3: 1 == 1
Running with x=1
match on line 2: 1 == 1
match on line 3: 1 == 1

または、ループを次に移動します(シェルを数回awk起動する必要がないため、より効率的です)。awk

awk -v x="$x" \
        '{ for (x=0; x<=1; ++x) {
               printf("x is %d\n", x);
               if ($1 == "x") { a = x } else { a = $1 }
               if ($2 == "x") { b = x } else { b = $2 }
               if (a == b) { printf("match on line %d: %d == %d\n", NR, a, b) }
           }
          }' file.in

出力:

x is 0
match on line 1: 0 == 0
x is 1
x is 0
x is 1
match on line 2: 1 == 1
x is 0
match on line 3: 1 == 1
x is 1
match on line 3: 1 == 1

おすすめ記事