2013-04-06 23 views
16

Uczę się awk/gawk. Tak niedawno próbuję rozwiązać każdy problem, aby uzyskać więcej okazji do ćwiczeń.jaki jest najprostszy sposób na usunięcie pierwszej i ostatniej linii z pliku za pomocą awk?

Mój współpracownik zadał pytanie wczoraj,

"jak usunąć pierwszy i ostatni wiersz z pliku"

. Wiem, że zadziała sed '1d;$d' file. również head/tail działa również, nawet jeśli słaba wydajność. Powiedziałem mu sed, był szczęśliwy.

Później próbowałem napisał awk jedno-liner: tak daleko, co mam jest:

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

To będzie przechowywać cały plik w tablicy po prostu pominąć ostatnią linię. Czuję, że nie powinno być łatwiejsze (lub lepszy) sposób to zrobić ..

(jeśli nie ma łatwiejsze i szybsze i lepiej jest, by usunąć pytanie)

dziękuję.

Odpowiedz

40

To załatwia sprawę:

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

awk wykonuje działania tylko wtedy, gdy NR print last> 2 (czyli na wszystkich liniach, ale pierwszym 2). We wszystkich liniach ustawia zmienną last na bieżącą linię. Kiedy awk czyta trzecią linię, drukuje wiersz 2 (który był przechowywany w last). Kiedy odczytuje ostatnią linię (linia n), drukuje zawartość linii n-1. Efekt netto jest taki, że drukowane są linie od 2 do n-1.

+1

TAK !!! Ja też w ten sposób, ale dał mi "NR> 1", po czym zrezygnowałem ... urrrr. w ogóle nie myślałem o NR> 2, jak głupio! .. świetnie! Dziękuję Ci! w górę! – Imagination

+0

potrzebujesz poczekać kilka minut, aby oznaczyć jako zaakceptuj .... – Imagination

+0

Umysł wyjaśniający nieco więcej magii? – eMPee584

5

Pozwól mi zaproponować inne rozwiązanie. W przypadku jeśli potrzebujesz niestandardowego n dla górnej i dolnej linii można użyć ogon i głowę polecenia:

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

głowy -n -1 - usuwa ostatnią linię

ogon - n + 2 - rozpoczyna wyprowadzanie z drugiej linii (usuwa 1 linię)

Następujące polecenie usunie 3 wiersze od góry i od dołu:

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

Właściwie nawet nie trzeba awk tutaj:

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

lub

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

Dzięki Igor Fobia za komentarz!

+2

Podoba mi się to rozwiązanie, ale teraz awk jest zbędny. Trzeba tylko zrobić "więcej nazw plików | głowa -n -1 | ogon -n + 2' –

Powiązane problemy