2008-10-13 6 views
9

Je peux écrire un script trivial pour le faire, mais dans ma quête continue pour obtenir plus de familliar avec unix, je voudrais apprendre des méthodes efficaces en utilisant des commandes intégrées à la place.Sautez les lignes de fichier jusqu'à ce qu'une correspondance soit trouvée, puis envoyez le reste

Je dois traiter de très gros fichiers qui ont un nombre variable de lignes d'en-tête. la dernière ligne d'en-tête est constituée du texte 'LastHeaderLine'. Je souhaite tout sortir après cette ligne. (Je ne suis pas inquiet au sujet de faux positifs.)

Répondre

6

En utilisant sed:

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

va correspondre à tout du match de regex à la fin du fichier. 'p' imprime les lignes qui correspondent.

Edit:

À la réflexion, vous ne voulez pas imprimer la ligne correspondant à LastHeaderLine. C'est difficile à faire avec sed. En perl, vous pouvez faire ce qui suit:

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

Ceci imprimerait seulement les lignes suivant strictement la correspondance regex. Pourquoi ne pas essayer awk pour cela?

9

Il ressemblerait à ceci:

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

NR == 1 est vrai pour la première ligne, /LastHeaderLine/ correspond à votre dernière ligne d'en-tête. L'opérateur virgule permet la fonction suivante {next} feu pour toutes les phrases dans la gamme des deux expression régulière. Dans ce cas, il passera à la ligne d'entrée suivante sans autre opération. Pour toutes les autres lignes d'entrée, les lignes seront imprimées sur la sortie standard, que vous pouvez rediriger en utilisant>.

20

Semblable à la réponse de Avi, mais sans inclure la ligne avec "LastHeaderLine".

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

C'est beaucoup plus propre que le mien :-) – Avi

Questions connexes