La declaración Awk else-if parece ejecutarse dos veces

La declaración Awk else-if parece ejecutarse dos veces

Quiero realizar las siguientes tareas,

1) imprimir palabra si el recuento de palabras de la línea = 1

2) imprima la cuarta palabra si el recuento de palabras de la línea> 3

3) imprimir una línea en blanco en todos los demás casos

El archivo de entrada es,

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

La salida esperada es,

welcome

Hi

welcome

Cuando uso el siguiente código, obtengo un resultado con una línea en blanco adicional, lo cual no es lo esperado.

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


Hi


welcome

Resolví esto usando el siguiente código,

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

Hi

welcome

Sin embargo, quiero entender qué salió mal y por qué la declaración se ejecuta dos veces y me da un resultado inesperado.

Respuesta1

Esto se debe a que printla declaración agrega de forma predeterminada una nueva línea al final de la cadena que está imprimiendo. Cuando se usa con \nél, se imprime una nueva línea doble como se ve en la salida. Usar printfen su lugar

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

Sin las construcciones de rama explícitas, if..else if..elsepuedes simplemente hacer

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

Respuesta2

El printcomando siempre agrega una nueva línea. Entonces print "\n"imprime la nueva línea que especificaste más la que agregó.

Puedes usar print ""o printf "\n".

información relacionada