awk를 사용하여 변수를 여러 값으로 설정하는 방법은 무엇입니까?

awk를 사용하여 변수를 여러 값으로 설정하는 방법은 무엇입니까?

다음과 유사한 파일이 있습니다.

x 0
1 x
1 1

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

답변2

awk의 스칼라 변수는 단일 변수만 보유할 수 있습니다. 다음과 같이 해야 합니다.

if (
    ($1 == "x" && ($2 == 0 || $2 == 1)) ||
    ($2 == "x" && ($1 == 0 || $1 == 1)) ||
    $1 == $2
) print "good"

관련 정보