Omita las primeras 6 líneas / filas en un archivo de texto con awk

39

¿Cómo puedo omitir las primeras 6 líneas / filas en un archivo de texto (input.txt) y procesar el resto con awk? El formato de mi script awk (program.awk) es:

BEGIN {
} 

{ 
process here
} 

END {

}

Mi archivo de texto es así:

0
3
5
0.1 4.3
2.0 1.5
1.5 3.0
0.3 3.3
1.5 2.1
.
.
.

Quiero procesar el archivo a partir de:

0.3 3.3
1.5 2.1
.
.
.
amatek
fuente

Respuestas:

60

Use cualquiera de los dos patrones:

NR>6 { this_code_is_active }

o esto:

NR<=6 { next }
{ this_code_is_active }

Use FNR en lugar de NR si tiene muchos archivos como argumentos para awk y desea omitir 6 líneas en cada archivo.

Janis
fuente
29

Tratar:

awk 'FNR > 6 { #process here }' file
Cuonglm
fuente
44
¡Bueno! Pero no explicó por qué esto es mejor: para varios archivos FNRes el número de fila en cada archivo, mientras que NRes el número en toda la entrada (no es un problema al canalizar).
Tomasz Gandor
3

También puede omitir un número arbitrario de líneas al principio o al final del archivo usando heado tailprogramas.

Para su pregunta concreta,

tail input.txt -n+7 | program.awk

lo hará, siempre que su program.awkarchivo sea ejecutable. De lo contrario, puede usar

tail input.txt -n+7 | awk -f program.awk

De esta manera, ahorrará una comparación para cada línea y no necesitará cambiar la lógica de su código AWK.

tail comenzará a transmitir texto a partir de la séptima línea, omitiendo las seis primeras líneas.

Esto no será un gran problema en el rendimiento, especialmente si el proceso de texto es simple gracias al almacenamiento en caché. Sin embargo, para archivos largos y el uso repetido en un entorno de nube puede ahorrar algunos costos.

Dr. Windows
fuente
Correcto, pero como regla general, uno debe evitar las tuberías cuando puede hacerlo fácilmente con una sola herramienta. Piense en un gran archivo de texto que pasa por ambos comandos solo para eliminar algunas líneas.
Philippos