2013-04-02 16 views
11

Mam duże pliki CSV, w których chcę wyodrębnić wszystkie dane między wierszem X, który zawiera wzór "x" i wiersz Y, który zawiera wzór "y"Sed/Awk - przeciągnij linie między wzorami x i y

na przykład:

other_data 
Header 
data 
data 
data 
Footer 
other_data 

Chcę móc rury wszystko pomiędzy (włącznie) Nagłówek -> stopki do nowego pliku.

Dzięki!

Odpowiedz

16

Korzystanie awk to całkiem proste:

awk '/Header/ { show=1 } show; /Footer/ { show=0 }' 

Zasadniczo utrzymać stan w zmiennej o nazwie show. Kiedy uderzymy w nagłówek, włączamy go, Footer wyłączamy. Gdy jest włączony, reguła show wykonuje domyślną akcję drukowania rekordu.

+0

To działa doskonale, dziękuję za wyjaśnienie! – Numpty

+3

+1, ponieważ jest to właściwa odpowiedź, ponieważ można ją łatwo poprawić, aby uwzględnić sytuacje, w których chcesz wydrukować pierwszą linię lub ostatnią linię lub obie linie lub cokolwiek innego, co chcesz zrobić. Rozwiązania wykorzystujące/start /,/end/range, gdy nieco słabiej rozpadają się przy najmniejszych wymaganiach, zmieniają się - ten wzór sprawia, że ​​rozwiązania drobnych problemów są nieco krótsze, ale rozwiązania nie nietrywialnych problemów DUŻO dłuższe i bardziej skomplikowane lub wymagają ponownego zapisu do ten styl. –

14

Jest to dość proste w sed:

sed -n '/Header/,/Footer/p' 

lub

sed '/Header/,/Footer/!d' 
+0

Działa równie dobrze jak AWK, dziękuję. Odbiorę Fatalę, odkąd tu przyjechał, ale dziękuję ci za to. Oto +1 – Numpty

+1

Znalazłem pierwszą opcję (zakończenie '/ p'), która zajęłaby 1/4 czasu jako rozwiązanie awk. Druga opcja ('/! D') zajęła tyle samo czasu co awk. W dużym pliku zaczyna to mieć znaczenie. – RaveTheTadpole

+0

Działa to również, gdy separator jest taki sam. Wersja 'awk' działa tylko wtedy, gdy są różne. – akostadinov

9

Innym sposobem z awk:

awk '/Header/,/Footer/' file 
Header 
data 
data 
data 
Footer 

Wystarczy przekierować wyjście do zapisywania w newfile:

awk '/Header/,/Footer/' file > newfile 
+1

Twój jest najładniejszy, więc masz rację :) – Numpty

+0

Tak, to wygląda najlepiej. +1. – Beta

+0

Jestem ciekawy: czy istnieje "od nagłówka do końca pliku" przy użyciu tego rodzaju wzoru? (To bardzo proste, korzystając z najlepszego rozwiązania awk, ale zastanawiając się, czy istnieje znacznik "końca pliku" zamiast "/ Footer /") –

1

To może pracować dla Ciebie (GNU sed):

sed '/^Header/,/^Footer/w new_file' file 
+0

To działa, ale przekierowuje cały oryginalny plik na standardowe wyjście. Powoduje to również trudności w użyciu z rurami. – Sparhawk

Powiązane problemy