2012-01-13 6 views
20

J'essaie de supprimer les deux premières lignes d'un fichier en ne l'imprimant pas dans un autre fichier. Je ne cherche pas quelque chose d'extraordinaire. Voici mon (échec) tentative awk:Suppression des deux premières lignes d'un fichier en utilisant BASH ou awk ou sed ou autre

awk '{ (NR > 2) {print} }' myfile 

Cela jette l'erreur suivante:

awk: { NR > 2 {print} } 
awk:  ^syntax error 

Exemple:

contenu 'monfichier':

blah 
blahsdfsj 
1 
2 
3 
4 

Qu'est-ce que Je veux que le résultat soit:

1 
2 
3 
4 

Répondre

51

Utilisez la queue:

tail -n+3 file 

de la page man:

-n, --lines=K 
      output the last K lines, instead of the last 10; or use -n +K 
      to output lines starting with the Kth 
+4

Devrait être +3 (démarrer sur la 3ème ligne) ... – cmbuckley

+0

Devrait être 'queue -n + 3 fichier', mais merci! – Amit

16

Vous y êtes presque. Essayez ceci:

awk 'NR > 2 { print }' myfile 

awk est fondé sur des règles, et la règle apparaît nue (à savoir, sans accolades) avant que le bloc ne woud exécuter si elle passe.

également comme Jaypal a souligné, dans awk si tout ce que vous voulez faire est d'imprimer la ligne qui correspond aux règles que vous pouvez même omettre l'action, ce qui simplifie la commande:

awk 'NR > 2' myfile 
+0

Il pourrait également mettre un 'if' avant les parenthèses, bien que votre chemin soit meilleur, puisqu'il n'engage pas toutes les lignes, seulement celles qui correspondent déjà. –

+1

Vous n'avez même pas besoin de '{print}'. "awkish" serait "awk" NR> 2 'myfile' –

20

Que diriez-vous:

tail +3 file 

OU

awk 'NR>2' file 

OU

sed '1,2d' file 
+1

Une autre variante de sed: 'sed -n' 3, $ p 'file' – anubhava

4

awk est basé sur les instructions pattern{action}. Dans votre cas, le pattern est NR>2 et le action que vous souhaitez exécuter est print. Ce action est également le default action de awk.

Ainsi, même si

awk 'NR>2{print}' filename

fonctionnerait très bien, vous pouvez le raccourcir à

awk 'NR>2' filename.

Questions connexes