
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 print
la 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 printf
en 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..else
puedes simplemente hacer
awk 'NF>3 { print $4; next } NF==1 { print $1; next } { printf "\n" }'
Respuesta2
El print
comando 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"
.