Estou lendo o famoso tutorial do awk no link .
Em que mencionou To be precise, in the original AWK you can insert a new line character after the curly braces, and at the end of a command, but not elsewhere.
Eu recebi o seguinte teste de comando awk de várias linhas no meu host mac e remoto, com awk
e gawk
:
awk '$0 !~ /special_signal/ \
{ my_dict[$1] += $2 }
END { for (uid in my_dict) \
if (my_dict[uid] > 1) \
print uid, my_dict[uid]}' raw_data | sort -nk2
O comando awk original de uma linha do código awk acima é:
awk '$0 !~ /special_signal/ { my_dict[$1] += $2 } END { for (uid in my_dict) if (my_dict[uid] > 1) print uid, my_dict[uid]}' raw_data | sort -nk2
Através dos meus experimentos. Eu encontrei em ambos os awk
e gawk
, o primeiro \
é essencial, sem ele, o código se comportará diferentemente em comparação com o one-liner original. O efeito do caractere de nova linha é idêntico ao ;
Mas o segundo e terceiro \
após for (uid in my_dict)
e if (my_dict[uid] > 1)
em todas essas duas edições awk são desnecessários.
Eu os removi, o código múltiplo age exatamente como o de uma linha.
Depois, substituí o segundo e o terceiro \
por ;
, o que levará o código de várias linhas a produzir um resultado errado.
Isso provou ainda mais que se eu adicionar um caractere de nova linha depois de for (uid in my_dict)
e if (my_dict[uid] > 1)
, eles conectarão esses dois blocos de código com o código da próxima linha, agem como \
.
Minha conclusão parece conflitar com o tutorial.
Então, de fato, em quais circunstâncias o awk tratará a nova linha como ;
e como tratá-la como \
?
PS: por causa do teste, fiz um conteúdo de teste para raw_data
:
Tom 2
Tom 5
Jack 3
Mary 5
special_signal 5
Tim 10
Don 22
Jan 3
Jack 8
special_signal 10