O segundo awk
lê duas entradas, uma após a outra - da saída canalizada do primeiro awk
e depois do próprio arquivo. Uma maneira de identificar o início da segunda entrada é que NR
(o N umber da entrada atual R ecord, no geral) não corresponde mais a FNR
(o número de registro atual de F ile). Observe que -
como um argumento FILE arg informa ao awk
para obter os dados de stdin
(através de um pipe , neste caso).
awk '$6=="H"{print $5}' "$1" |
awk 'NR==FNR{k[$1];next}
$5 in k{print}' - "$1"
Observe que o método acima de identificar a segunda entrada é de uso comum, mas não se comporta como esperado / desejado quando não há nada para ler da primeira entrada. Para os requisitos deste trabalho, não importa se o primeiro resultado não entregar nada. A lógica nunca passará de NR=FNR
, onde construirá uma lista de k
valor do índice (ou seja, $1
do arquivo principal) - mas nada é feito com eles - então o script funciona com um valor nulo através do pipe, mas apenas por causa de um efeito colateral desordenado da lógica particular usada.
Existe, no entanto, no GNU awk ( gawk
), uma maneira segura de identificar o arquivo / pipe atual. Há uma variante especial na linha de comando FILE
arguments: "... um argumento que tem o formato var = value, atribui valor à variável var - não especifica um arquivo." - veja: Outros Argumentos da Linha de Comando A colocação de tais var = value args é significante - valores necessários para um FILE específico devem ser colocados na linha de comando antes do seu arquivo associado - subseqüente var = value não são aplicados em awk
até que os arquivos / canais anteriores tenham sido totalmente lidos.
Aqui está a versão var = value .
gawk '$6=="H"{print $5}' "$1" |
gawk 'fn==1{k[$1];next}
$5 in k{print}' fn=1 - fn=2 "$1"
saída (é a mesma para as duas versões do script)
a b c d 31 1
a b c d 31 H
a b c d 31 2
a b c d 33 1
a b c d 33 H
a b c d 33 2