次のようなファイルがあります。
x 0
1 x
1 1
私は本質的に各行の2つのフィールドが互いに等しいことを確認したいと思います。しかし、問題は、このファイルに保存できる値が含まれていることです。x
- しかし、設定方法がわかりません。0
1
awk
次のコードを試しましたが、うまくいきません。どちらか一方にx
設定するか、どちらも設定していない場合にのみ機能します。0
1
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つの列の文字をテストし、x
trueの場合は変数の現在の値(コマンドラインで設定)に設定します。awk
x
次の列が同じ場合、いくつかの出力が生成されます。
与えられたデータに基づいて出力を生成します。
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
答え2
awkのスカラー変数は単一の変数しか保持できません。次のようにする必要があります。
if (
($1 == "x" && ($2 == 0 || $2 == 1)) ||
($2 == "x" && ($1 == 0 || $1 == 1)) ||
$1 == $2
) print "good"