
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 print
a instrução, por padrão, adiciona uma nova linha no final da string que está imprimindo. Quando usado, \n
imprime uma nova linha dupla, como você vê na saída. Use printf
em 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..else
você pode simplesmente fazer
awk 'NF>3 { print $4; next } NF==1 { print $1; next } { printf "\n" }'
Responder2
O print
comando 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"
.