Os comandos a seguir produzem a mesma resposta:
tail -n 1 ~/watchip.sh.csv | awk 'BEGIN { FS = "," } ; { print $1 }'
tail -n 1 ~/watchip.sh.csv | awk '{ FS = "," } ; { print $1 }'
EDIT: Desde que postei esta pergunta, aprendi minha afirmação de que os dois comandos acima produzem a mesma resposta NÃO é verdade. Pelo menos não em geral. E assim parece que o comando acima é um exemplo de quando uma
BEGIN
instrução é necessária. Desculpas pela confusão.
Não sou um awk
usuário experiente, mas estou tentando entender melhor o uso e lendo a documentação. Mas tudo que li em BEGIN e END é confuso (faz pouco sentido para mim). Talvez seja porque eu usei apenas awk
em situações muito limitadas.
Alguém pode explicar brevemente quando uma instrução BEGIN seria necessária em awk
?
Você geralmente usa cláusulas
BEGIN
e quando deseja certas ações antes e depois que o processamento real no arquivo acontece, respectivamente. Portanto, com essa lógica, as instruções/ações dentro delas são executadas apenas uma vez para o arquivo de entrada fornecido.END
awk
Que tipo de ações são geralmente feitas em
BEGIN
?Inicializando suas variáveis especiais para dividir sua entrada de linha, ou seja, separadores de campo de entrada e saída
FS
,OFS
. Embora sempre se possa definir essas variáveis especiais usando a-v FS=
construção ou defini-las por meio de um operador regex-F','
, é muito mais legível quando feito dessa maneira. Do seu exemplo de ter que definir{ FS="," }
dentro do corpo doawk
é bastante redundante, pois inicializa a variável para cada linha do seu arquivo de entrada. Por exemplo, se sua linha contém n linhas, a inicialização acontece n vezes.Definindo uma linha de cabeçalho personalizada para sua saída gerada a partir do corpo do
awk
script. Por exemplo, do exemplo anterior, gostaria de imprimir um cabeçalho que diz, estou imprimindo os valores da primeira coluna( Opcionalmente - apenas para facilitar a leitura) - Você também pode inicializar suas variáveis que serão usadas dentro do corpo do programa. Embora não seja recomendado, uma vez
awk
que lida com inicializações de variáveis dinamicamente, seria bomBEGIN
para entender o estado da variávelQue tipo de ações são geralmente feitas em
END
?Acompanhe a contagem de linhas processadas no corpo do
awk
comando. Um idioma geral seria rastrear a contagem de linhas em um arquivo, usamos aawk
variável especialNR
que é um contador em execução que é incrementado à medida que cada linha é processada. ou seja, na primeira linha o valor da variável será 1 e incrementado posteriormente. Mas, dado isso, como imprimimos a contagem total de linhas no arquivo. Não se pode fazer umprint NR
no corpo do arquivo, pois imprimiria o número da linha atual enquantoawk
processa o arquivo. Por exemplo, o primeiro trecho abaixo não funcionará. Então, issoEND
entra quando as instruções dentro dele são obtidas após a conclusão do processamento do arquivo. Então, fazendo o mesmo print nosEND
meios, estamos conseguindo imprimir o último valor armazenado emNR
Assim como na
BEGIN
cláusula para imprimir as informações do cabeçalho, você pode imprimir strings, informações como um resumo, pois a essa altura todo o processamento do arquivo estará completo.Esta documentação A programação AWK eficaz é o melhor recurso disponível para conhecer melhor a ferramenta.
"Programação AWK Eficaz" me ajudou muito.
awk funciona em regras, regras consistem em um padrão e uma ação, você pode omitir qualquer um deles, mas não ambos. BEGIN e END é um padrão, {...} é uma ação. A ação será executada se não tiver padrões ou correspondências de padrões.
No programa awk comum: