2013-04-02 36 views
11

Tôi có một số tệp CSV lớn nơi tôi muốn trích xuất tất cả dữ liệu giữa Dòng X bao gồm mẫu 'x' và Dòng Y bao gồm mẫu 'y'Sed/Awk - đường kéo giữa mẫu x và y

Ví dụ:

other_data 
Header 
data 
data 
data 
Footer 
other_data 

tôi muốn để có thể đường ống tất cả mọi thứ giữa (và bao gồm) Tiêu đề -> Footer vào một tập tin mới.

Cảm ơn!

Trả lời

16

Sử dụng awk nó khá đơn giản:

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

Về cơ bản giữ trạng thái trong một biến có tên show. Khi chúng ta nhấn Header, chúng ta bật nó lên, Footer chúng ta tắt nó đi. Trong khi bật, quy tắc show thực hiện tác vụ mặc định khi in bản ghi.

+0

Đó hoạt động hoàn hảo, cảm ơn bạn đã giải thích! – Numpty

+3

+1 vì đây là câu trả lời đúng vì nó được dễ dàng nâng cao để bao gồm các tình huống mà bạn muốn in dòng đầu tiên hoặc dòng cuối cùng hoặc cả hai dòng hoặc bất cứ điều gì khác mà bạn muốn làm. Các giải pháp sử dụng/start /,/end/range trong khi hơi briefer sụp đổ với sự thay đổi nhỏ nhất - mẫu đó làm cho các giải pháp cho các vấn đề tầm thường hơi briefer nhưng các giải pháp cho các vấn đề không tầm thường MUCH dài và phức tạp hơn hoặc yêu cầu viết lại phong cách này. –

14

Nó khá đơn giản trong sed:

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

hoặc

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

Hoạt động cũng như AWK, cảm ơn bạn. Tôi sẽ cho Fatal chấp nhận vì anh ta đã đến đây trước, nhưng cảm ơn vì điều này. Đây là +1 – Numpty

+1

Tôi đã tìm thấy tùy chọn đầu tiên (kết thúc '/ p') lấy 1/4 thời gian làm giải pháp awk. Tùy chọn thứ hai ('/! D') mất khoảng thời gian tương tự như awk. Trong một tập tin lớn, nó bắt đầu quan trọng. – RaveTheTadpole

+0

Điều này cũng hoạt động khi dấu phân cách giống nhau. Phiên bản 'awk' chỉ hoạt động khi chúng khác nhau. – akostadinov

9

Một cách khác với awk:

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

Chỉ cần chuyển hướng đầu ra để tiết kiệm trong một newFile:

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

Bạn là người đẹp nhất, vì vậy bạn nhận được một điểm :) – Numpty

+0

Vâng, điều này có vẻ như là tốt nhất. +1. – Beta

+0

Tôi tò mò: là có một "từ Tiêu đề cho đến khi kết thúc tập tin" bằng cách sử dụng loại mô hình? (Nó rất dễ sử dụng giải pháp hàng đầu, nhưng tự hỏi nếu có dấu "kết thúc tệp", thay vì "/ Footer /") –

1

Điều này có thể làm việc cho bạn (GNU sed):

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

Điều này có tác dụng, nhưng cũng chuyển hướng toàn bộ tệp gốc sang chế độ xuất chuẩn. Điều này cũng làm cho nó khó sử dụng với đường ống. – Sparhawk

Các vấn đề liên quan