[GNU awk v4.2.1 no Archlinux]
A supressão awk
da ação de impressão padrão para stdout do cli é fácil e bem documentada no UL, por exemplo, aqui . Fazer isso a partir de um script me dá dores de cabeça. Aqui está o roteiro do brinquedo:
#!/usr/bin/awk -f
BEGIN {FS=","}
FNR > 1 # skip header
{
if ( $1 == $2 ) {
if ( NR == 4 ) {
printf("*** Print NR=4 ok. \n")
} else {
print > "/dev/null" # print nothing
}
} else {
printf("=== Fields 1 and 2 not equal (NR=%s). \n",NR)
}
}
e dados do brinquedo:
col1 col2
1,3
2,2
aa,aa
3.01,-353.01
4.1,4.1
101,101
hello, hello
asd,koi0
juntamente com a saída esperada / desejada:
=== Fields 1 and 2 not equal (NR=2).
*** Print NR=4 ok.
=== Fields 1 and 2 not equal (NR=5).
=== Fields 1 and 2 not equal (NR=8).
=== Fields 1 and 2 not equal (NR=9).
Em vez disso, recebo:
=== Fields 1 and 2 not equal (NR=1).
1,3
=== Fields 1 and 2 not equal (NR=2).
2,2
aa,aa
*** Print NR=4 ok.
3.01,-353.01
=== Fields 1 and 2 not equal (NR=5).
4.1,4.1
101,101
hello, hello
=== Fields 1 and 2 not equal (NR=8).
asd,koi0
=== Fields 1 and 2 not equal (NR=9).
Para suprimir a saída para stdout, tentei usar:
getline
, {}
, next
e printf("")
até mesmo o outlandish ORS=""; print ""; ORS="\n"
em vez de print > "/dev/null"
. Obviamente estou fazendo algo muito errado nesse maldito script e não consigo encontrar o que ...
O único erro é
que deve ser
Um bloco de código com uma condição deve iniciar na mesma linha que a condição.
O que seu script original realmente faz é primeiro
Isso imprime todas as linhas da linha dois em diante (a ação padrão quando uma condição não tem um bloco de código associado é imprimir o registro atual se a condição for verdadeira, como se o bloco tivesse sido
{ print }
).Em seguida, ele aplica o bloco seguinte a cada linha (já que esse bloco não possui uma condição associada).
Esta não é uma peculiaridade do GNU
awk
. Todas asawk
implementações devem agir assim.Quanto aos outros bits do script:
Isso pode ser excluído, deixando
ou,