Uma variável escalar no awk só pode conter uma única variável. Você terá que fazer algo assim:
if (
($1 == "x" && ($2 == 0 || $2 == 1)) ||
($2 == "x" && ($1 == 0 || $1 == 1)) ||
$1 == $2
) print "good"
Eu tenho um arquivo semelhante ao seguinte:
x 0
1 x
1 1
e estou essencialmente tentando ver se os dois campos são iguais ou não para cada linha. Mas o problema é que esse arquivo contém x
, que pode conter o valor de 0
ou 1
- mas não tenho certeza de como definir isso em awk
Eu tentei trabalhar com o seguinte código que não funcionava, só funciona se x
estiver definido como 0
ou 1
, não ambos.
y=$(seq 1 2)
awk -v x="$y" '{ if ($1==$2) print "good" }' file
Por favor, informe ou deixe-me saber se algum esclarecimento é necessário, obrigado.
Uma variável escalar no awk só pode conter uma única variável. Você terá que fazer algo assim:
if (
($1 == "x" && ($2 == 0 || $2 == 1)) ||
($2 == "x" && ($1 == 0 || $1 == 1)) ||
$1 == $2
) print "good"
Você não pode definir uma variável para vários valores em qualquer linguagem de programação comum que eu conheça, mas você pode certamente passar por cima de um conjunto de valores com uma variável.
Construa um loop de shell em torno do código awk
que é executado para cada valor de 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
O código awk
testa as duas colunas para o caractere x
e (se verdadeiro) define o valor atual de awk
variable x
(que é definido na linha de comando).
Se as colunas mais tarde forem as mesmas, alguma saída será produzida.
Com os dados fornecidos, isso produz a saída
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
Como alternativa, mova o loop para awk
(que não parece tão bom):
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
Saída:
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
Tags awk