Para fazer múltiplas passagens no mesmo arquivo de entrada, este caso simples funciona bem:
$ awk 'p==1{print $1}; p==2{print $2}; p==3{print $3}' p=1 infile p=2 infile p=3 infile
Mas falhar com essa mudança?
$ awk 'p==1{/Jan/ {print $1}}; p==2{print $2}; p==3{print $3}' p=1 infile p=2 infile p=3 infile
Não quero usar termos como:
p==1 && /Jan/ {print $1}
pois quero manter a estrutura legível do código (original).
Como posso usar termos condicionais dentro de cada colchete?
Exemplo:
$ cat infile
James Exeter 48
Alex Leeds 22
Jan London 35
resultado desejado:
Jan
Exeter
Leeds
London
48
22
35
O
/regexp/
operador é um operador que retorna 1 se$0
corresponder à regexp e 0 caso contrário.Você pode usá-lo como
print /foo/ + /bar/
, por exemplo, ouif (/foo/) print "match"
ou naCONDITION
parte de umaCONDITION { ACTION }
instrução, mas usá-lo como parte doACTION
in/foo/ {something}
é uma sintaxe inválida, da mesma formaa == b {something}
ou"whatever" {something}
é inválido aí.Você iria querer:
Observe também as chamadas para
next
evitar testesp==2
ep==3
se houverp==1
correspondência, por exemplo.Aqui, você também pode simplesmente fazer:
Ou para imprimir apenas registros correspondentes
/Jan/
quandop==1
:$
também é um operador, você pode usar$p
ou$ p
ou$ (p * 2 - p)
ou$ (field_to_print = p)
que invocam o$
operador para expandir para o p- ésimo campo¹.Com a implementação GNU de
awk
(também chamadagawk
de ), você pode usarARGIND
which é incrementado para cada argumento em vez de ter que definirp
você mesmo:¹ Ou o registro inteiro se p == 0
@StéphaneChazelas respondeu à sua pergunta específica, mas para ser claro - você não precisa fazer várias passagens do arquivo de entrada para fazer o que está tentando fazer, você pode fazer isso em apenas uma passagem, por exemplo:
ou mais geralmente para qualquer número de campos:
Isso só falharia se o seu arquivo de entrada fosse absolutamente enorme, grande demais para caber na memória.