2008-10-13 12 views
9

Puedo escribir una secuencia de comandos trivial para hacer esto pero en mi búsqueda constante para obtener más familiaridad con Unix me gustaría aprender métodos eficientes usando comandos integrados.Omitir líneas de archivo hasta encontrar una coincidencia, luego generar el resto

Necesito tratar con archivos muy grandes que tienen un número variable de líneas de encabezado. la última línea de encabezado consiste en el texto 'LastHeaderLine'. Deseo dar salida a todo después de esta línea. (No estoy preocupado por falsos positivos partidos.)

Respuesta

6

usando sed:

sed -ne '/LastHeaderLine/,$p' <inputfile 

coincidirá con todo, desde el partido expresión regular para el final del archivo. 'p' imprime las líneas que coinciden.

Editar:

Pensándolo bien, no desea imprimir la línea de juego LastHeaderLine. Esto es difícil de hacer con sed. En Perl, puede hacer lo siguiente:

perl -ne 'if ($flag) {print;} if (/LastHeaderFile/) {$flag=1;}' <inputfile 

Esto imprimiría únicas líneas siguiendo estrictamente el partido de expresiones regulares.

9

¿Por qué no probar awk por esto? Se vería así:

awk 'NR == 1, /LastHeaderLine/ { next } { print }' myinputfile > myoutputfile 

donde NR == 1 es cierto para la primera línea, /LastHeaderLine/ coincida con su línea de cabecera pasado. El operador de coma permite la activación de la siguiente función {next} para todas las oraciones en el rango de las dos expresiones regulares. En este caso saltará a la siguiente línea de entrada sin más operación. Para todas las demás líneas de entrada, imprimirá las líneas en la salida estándar, que puede redirigir utilizando>.

20

Similar a la respuesta de Avi, pero sin incluir la línea con "LastHeaderLine".

sed -e '1,/LastHeaderLine/d' 
+0

Eso es mucho más limpio que el mío :-) – Avi

Cuestiones relacionadas