如何使用 awk 将变量设置为多个值?

如何使用 awk 将变量设置为多个值?

我有一个类似于以下内容的文件:

x 0
1 x
1 1

我本质上是想看看每一行的两个字段是否彼此相等。但问题是这个文件包含which 可以保存或的x值- 但我不知道如何设置它01awk

我尝试使用以下代码,但不起作用,它仅在x设置为0或之一时才有效1,而不是两者都有效。

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

如果需要任何澄清,请告知或让我知道,谢谢。

答案1

您无法在我所知道的任何普通编程语言中将变量设置为多个值,但您肯定可以使用变量循环一组值。

awk围绕针对 的每个值运行的代码构建一个 shell 循环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)。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(这会更有效,因为 shell 不需要启动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"

相关内容