Tenho o seguinte arquivo de entrada:
-Queue ID- --Size-- ----Arrival Time---- -Sender/Recipient-------
0F2F77F472 4343854 Fri Oct 7 10:13:41 [email protected]
(host redacted.host.com[x.x.x.x] said: 452 4.2.2 Over quota (in reply to end of DATA command))
[email protected]
03A017F486 992790 Fri Oct 7 13:09:44 [email protected]
(host host.redacted.net[y.y.y.y] said: 452-4.2.2 The email account that you tried to reach is over quota. Please direct 452-4.2.2 the recipient to 452 4.2.2 redacted (in reply to RCPT TO command))
[email protected]
No meu script AWK, escrevi algo assim:
BEGIN {
RS = "\n\n"
}
{
... do something ...
}
O cabeçalho também seria processado, então no meu pipeline, antes de passar para o AWK, eu faço:
... | tail +2 | awk -f script
Reconheci que pular a primeira linha no AWK, principalmente, é fazer este truque simples:
{
if (NR > 1) {
...
}
}
Deveria funcionar, mas o RS = "\n\n"
que eu configurei no BEGIN
bloco faria com que o primeiro registro fosse ignorado (o AWK interpreta o cabeçalho como parte do primeiro registro).
Testes:
$ awk 'BEGIN { RS = "\n\n" } { print NF }' sample
28
41
$ awk 'BEGIN { RS = "\n\n" } NR > 1 { print NF }' sample
41
Existe alguma maneira de atingir o objetivo sem depender de nenhuma ferramenta externa?
GNU Awk 5.0.1, API: 2.0 (GNU MPFR 4.0.2, GNU MP 6.2.0)
Usando qualquer awk:
Quando você usa
RS = "\n\n"
o comportamento é indefinido pelo POSIX e então você precisa usar GNU awk ou qualquer outro awk que suporte especificamente multi-char RS (leia a página man do seu awk). Se, por outro lado, você usarRS = ""
o IS definido pelo POSIX como colocar o awk no modo de parágrafo onde cada registro é separado do próximo por linhas em branco.Não definir RS até que a primeira linha seja lida nos permite ler e descartar facilmente essa linha.