A instrução Awk else-if parece estar sendo executada duas vezes

A instrução Awk else-if parece estar sendo executada duas vezes

Quero realizar as tarefas abaixo,

1) imprimir palavra se contagem de palavras da linha = 1

2) imprima a 4ª palavra se a contagem de palavras da linha> 3

3) imprima uma linha em branco em todos os outros casos

O arquivo de entrada é,

cat file.txt
Hi there I welcome you
Hi there You
Hi
Hi there
Hi there I welcome you all

A saída esperada é,

welcome

Hi

welcome

Quando estou usando o código abaixo, ele fornece uma saída com linha em branco adicional, o que não é esperado.

cat file.txt | awk '{ if (NF>3) {print $4} else if (NF==1) {print $1} else {print "\n"} }'
welcome


Hi


welcome

Eu resolvi isso usando o código abaixo,

cat file.txt | awk '{ if (NF>3) {print $4} else if (NF==1) {print $1} else {print $10000} }'
welcome

Hi

welcome

No entanto, quero entender o que deu errado e por que outra instrução está sendo executada duas vezes e me dando uma saída inesperada?

Responder1

É porque printa instrução, por padrão, adiciona uma nova linha no final da string que está imprimindo. Quando usado, \nimprime uma nova linha dupla, como você vê na saída. Use printfem vez disso

awk '{ if (NF>3) {print $4} else if (NF==1) {print $1} else printf "\n" }' file

Sem as construções de ramificação explícitas, if..else if..elsevocê pode simplesmente fazer

awk 'NF>3 { print $4; next } NF==1 { print $1; next } { printf "\n" }'

Responder2

O printcomando sempre adiciona uma nova linha. Então print "\n"imprime a nova linha que você especificou mais aquela que foi adicionada.

Você pode usar print ""ou printf "\n".

informação relacionada