我有一个类似于以下内容的文件:
x 0
1 x
1 1
我本质上是想看看每一行的两个字段是否彼此相等。但问题是这个文件包含which 可以保存或的x
值- 但我不知道如何设置它0
1
awk
我尝试使用以下代码,但不起作用,它仅在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)。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
(这会更有效,因为 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"