2012-01-13 15 views
20

Sto tentando di eliminare le prime due righe di un file semplicemente non stampandolo su un altro file. Non sto cercando qualcosa di stravagante. Ecco la mia (fallito) tentativo di awk:Eliminazione delle prime due righe di un file utilizzando BASH o awk o sed o qualsiasi altra cosa

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

che butta fuori il seguente errore:

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

Esempio:

contenuto del 'myfile':

blah 
blahsdfsj 
1 
2 
3 
4 

Cosa Voglio che il risultato sia:

1 
2 
3 
4 

risposta

51

Uso coda:

tail -n+3 file 

dalla pagina 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

Dovrebbe essere +3 (iniziare su 3a linea) ... – cmbuckley

+0

Dovrebbe essere 'tail -n + 3 file', ma grazie! – Amit

16

Sei quasi. Prova a:

awk 'NR > 2 { print }' myfile 

awk è basata su regole e la regola appare nudo (cioè senza parentesi) prima del blocco che woud eseguire se passa.

anche come Jaypal ha sottolineato, in awk se tutto quello che vogliamo fare è stampare la linea che corrisponde alle regole si può anche omettere l'azione, semplificando così il comando a:

awk 'NR > 2' myfile 
+0

Potrebbe anche mettere un 'if' prima delle parentesi, anche se la tua strada è migliore, dal momento che non coinvolge tutte le linee, solo quelle che corrispondono già. –

+1

Non hai nemmeno bisogno di '{print}'. 'awkish' way sarebbe' awk 'NR> 2' myfile' –

20

ne dite di:

tail +3 file 

O

awk 'NR>2' file 

O

sed '1,2d' file 
+1

Un'altra variante di sed: 'sed -n '3, $ p' file' – anubhava

4

awk è basato su dichiarazioni pattern{action}. Nel tuo caso, lo pattern è NR>2 e lo action che desideri eseguire è print. Questo action è anche il default action di awk.

Così, anche se

awk 'NR>2{print}' filename

avrebbe funzionato bene, è possibile ridurre al

awk 'NR>2' filename.

Problemi correlati