print - ¿Cuál es la forma más fácil de eliminar la primera y última línea del archivo con awk?
awk unix (3)
Aquí hay otra forma, pero se requiere la longitud de la función gawk:
awk ''{firstline=2; cuttail=1; l[NR]=$0} END {for (i=firstline; i<=length(l)-cuttail; i++) print l[i]}''
Estoy aprendiendo awk / gawk. Recientemente, solo trato de resolver cualquier problema con él para obtener más oportunidades de práctica.
Mi compañero de trabajo hizo una pregunta ayer,
"Cómo eliminar la primera y última línea del archivo"
. Sé que sed ''1d;$d'' file
funcionaría. También funciona la head/tail
incluso si el rendimiento es bajo. Le dije que el sed, él estaba feliz.
Más tarde, estaba tratando de escribir un awk de una sola línea: hasta ahora lo que obtuve es:
awk ''NR>1{a[++k]=$0}END{for(i=1;i<k;i++)print a[i]}''
Esto almacenará todo el archivo en la matriz solo para omitir la última línea. Siento que debería haber una manera más fácil (o mejor) de hacer eso ...
(Si no hay una manera más fácil, más rápida o mejor, eliminaría la pregunta)
gracias.
Déjame sugerirte otra solución. En caso de que necesite una N personalizada para las líneas superior e inferior, puede usar los comandos tail y head :
awk ''{print $1}'' | head -n -1 | tail -n+2
head -n -1 - elimina la última línea
cola -n + 2 - inicia la salida desde la segunda línea (elimina 1 línea)
El siguiente comando eliminará 3 líneas de la parte superior e inferior:
awk ''{print $1}'' | head -n -3 | tail -n +4
En realidad, ni siquiera necesitamos awk aquí:
more | head -n -1 | tail -n +2
o
cat | head -n -1 | tail -n +2
Gracias a Igor Fobia por comentar!
Esto hace el truco:
awk ''NR>2 {print last} {last=$0}''
awk
ejecuta la acción de print last
solo cuando NR> 2 (es decir, en todas las líneas excepto en las 2 primeras). En todas las líneas, establece la last
variable en la línea actual. Entonces, cuando awk
lee la tercera línea, imprime la línea 2 (que se guardó en la last
). Cuando lee la última línea (línea n), imprime el contenido de la línea n-1. El efecto neto es que las líneas 2 a n-1 se imprimen.