2013-04-06 9 views
16

Sto imparando awk/gawk. Di recente, cerco solo di risolvere qualsiasi problema per ottenere maggiori opportunità di pratica.qual è il modo più semplice per rimuovere la 1a e l'ultima riga dal file con awk?

Il mio collega ha fatto una domanda ieri,

"come rimuovere prima e l'ultima riga dal file"

. So che sed '1d;$d' file funzionerebbe. anche head/tail funziona anche se la prestazione scarsa. Gli ho detto quello sed, era felice.

Più tardi, stavo cercando di scritto un awk one-liner: finora quello che ho ottenuto è:

awk 'NR>1{a[++k]=$0}END{for(i=1;i<k;i++)print a[i]}' 

Questo memorizzerà intero file in ordine solo saltare l'ultima riga. Sento che ci dovrebbe essere un modo più semplice (o superiore) per farlo ..

(se non più facile o più veloce o meglio c'è, vorrei rimuovere la questione)

grazie.

risposta

40

Questo fa il trucco:

awk 'NR>2 {print last} {last=$0}' 

awk esegue l'azione print last solo quando NR> 2 (cioè, su tutte le linee, ma il primo 2). Su tutte le righe, imposta la variabile last sulla riga corrente. Pertanto, quando awk legge la terza riga, stampa la riga 2 (che è stata memorizzata in last). Quando legge l'ultima riga (riga n) stampa il contenuto della riga n-1. L'effetto netto è che le righe da 2 a n-1 vengono stampate.

+1

SI !!! Anche se di questo modo, ho dato 'NR> 1'.. quindi ho rinunciato ... urrrr. non pensavo affatto a NR> 2, quanto stupido! .. fantastico! grazie! su! – Imagination

+0

è necessario attendere alcuni minuti per contrassegnare come accetta .... – Imagination

+0

La mente spiega la punta magica più in modo verbale? – eMPee584

5

Lasciatemi suggerire un'altra soluzione. Nel caso in cui se avete bisogno del N per le linee superiore e inferiore è possibile utilizzare coda e testa comandi:

awk '{print $1}' | head -n -1 | tail -n+2 

head -n -1 - rimuove ultima riga

coda - n + 2 - avvia l'output dalla seconda riga (rimuove 1 riga)

Il seguente comando rimuoverà 3 righe dall'alto e dal basso:

awk '{print $1}' | head -n -3 | tail -n +4 

In realtà non hanno nemmeno bisogno awk qui:

more | head -n -1 | tail -n +2 

o

cat | head -n -1 | tail -n +2 

Grazie a Igor Fobia per un commento!

+2

Mi piace questa soluzione, ma ora awk è superfluo. Hai solo bisogno di 'più nomefile | testa -n -1 | coda -n + 2' –