2008-10-13 20 views
9

Tôi có thể viết một kịch bản tầm thường để thực hiện điều này, nhưng trong nhiệm vụ liên tục của mình để có được nhiều familliar hơn với unix, tôi muốn tìm hiểu các phương thức hiệu quả bằng cách sử dụng các lệnh tích hợp.Bỏ qua các dòng tập tin cho đến khi tìm thấy kết quả phù hợp, sau đó xuất phần còn lại

Tôi cần xử lý các tệp rất lớn có số lượng dòng tiêu đề thay đổi. dòng tiêu đề cuối cùng bao gồm văn bản 'LastHeaderLine'. Tôi muốn xuất tất cả mọi thứ sau dòng này. (Tôi không lo lắng về trận đấu dương tính giả.)

Trả lời

6

Sử dụng sed:

sed -ne '/LastHeaderLine/,$p' <inputfile 

sẽ phù hợp với tất cả mọi thứ từ các trận đấu regex để cuối của tập tin. 'p' in các dòng phù hợp.

Chỉnh sửa:

Suy nghĩ thứ hai, bạn không muốn in dòng khớp với LastHeaderLine. Điều này rất khó làm với sed. Trong perl, bạn có thể thực hiện các thao tác sau:

perl -ne 'if ($flag) {print;} if (/LastHeaderFile/) {$flag=1;}' <inputfile 

Điều này sẽ chỉ in các dòng theo đúng kết quả regex.

9

Tại sao bạn không thử tìm hiểu điều này? Nó sẽ giống như thế này:

awk 'NR == 1, /LastHeaderLine/ { next } { print }' myinputfile > myoutputfile 

nơi NR == 1 là đúng đối với dòng đầu tiên, /LastHeaderLine/ phù hợp với dòng tiêu đề cuối cùng của bạn. Toán tử dấu phẩy cho phép chức năng sau {next} kích hoạt tất cả các câu trong phạm vi của hai biểu thức chính quy. Trong trường hợp này, nó sẽ chuyển sang dòng đầu vào tiếp theo mà không cần thao tác thêm. Đối với tất cả các dòng đầu vào khác, nó sẽ in các dòng tới đầu ra tiêu chuẩn mà bạn có thể chuyển hướng bằng cách sử dụng>.

20

Tương tự như câu trả lời của Avi, nhưng không bao gồm dòng có "LastHeaderLine".

sed -e '1,/LastHeaderLine/d' 
+0

Sạch hơn nhiều so với tôi :-) – Avi

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