como definir uma variável para vários valores com awk?

2

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.

    
por anont 26.11.2015 / 21:39

2 respostas

0

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"
    
por 26.11.2015 / 22:03
0

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
    
por 20.09.2017 / 00:07

Tags