다음과 유사한 파일이 있습니다.
x 0
1 x
1 1
나는 본질적으로 각 행의 두 필드가 서로 같은지 확인하고 싶습니다. 하지만 문제는 이 파일에 저장할 수 있는 값이 포함되어 있다는 것입니다. 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
는 두 열의 문자를 테스트하고 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"