2012-04-12 26 views
6

Tôi có một tập tin với kết quả như sau:Có cách nào để phù hợp với mô hình như vậy với vỏ hoặc sed?

BP 0 test: 
    case id   Name    
    ====== ======== ================= 
     0  82 a_case-2-0-0  

BP 1 test: 
    case id   Name    
    ====== ======== ================= 
     0  86 a_case-2-1-0  

BP 2 test: 
    case id   Name    
    ====== ======== ================= 


BP 3 test: 
    case id   Name    
    ====== ======== ================= 
     0  93 a_case-2-3-0 

như vậy, chỉ "BP 0,1,3" có nội dung, vì vậy những gì tôi muốn là, là nó có thể để đổ 'BP 0 test', 'BP 1 kiểm tra 'và' kiểm tra BP 3 'chỉ, chỉ muốn ingore' BP 2 thử nghiệm 'vì không có trường hợp thử nghiệm.

Cảm ơn sự giúp đỡ của bạn.

+0

Bạn muốn awk cho việc này. –

+1

Bạn đã thử những gì? Thật khó để trợ giúp mã của bạn nếu bạn không đưa mã vào câu hỏi của mình. – Graham

Trả lời

3
$ awk -F'\n' -v RS='' -v ORS='\n\n' 'NF>3' input.txt 
BP 0 test: 
    case id   Name 
    ====== ======== ================= 
     0  82 a_case-2-0-0 

BP 1 test: 
    case id   Name 
    ====== ======== ================= 
     0  86 a_case-2-1-0 

BP 3 test: 
    case id   Name 
    ====== ======== ================= 
     0  93 a_case-2-3-0 
+2

Whee, rất tốt đẹp. :-) – ghoti

+0

nó rất tốt cho tôi. – user1110921

+0

Tôi yêu rằng thành ngữ 'RS = '' 'với awk. Một lý do khác để rời khỏi búa tạ Perl ở tầng hầm. –

2

Nếu grep của bạn hỗ trợ tùy chọn -B sau đó bạn có thể làm như thế này

grep -B3 "_case-" <ip_file> | grep "BP " 

Kết quả cho ở trên là

BP 0 test: 
BP 1 test: 
BP 3 test: 

Đây -B3 in 3 dòng trên mô hình phù hợp.

3

Trong khi bạn có thể Whack một cái gì đó cùng nhau sử dụng công cụ vỏ nhỏ hơn như [expr, nó sẽ có cách dễ dàng hơn để làm điều này bằng awk, mà bạn thường sẽ tìm thấy trong bất kỳ hệ điều hành mà cũng bao gồm grepsed. :)

Dưới đây là một cách nhanh chóng-và-bẩn:

[[email protected] ~]$ cat doit 
#!/usr/bin/awk -f 

/^BP/ { 
    output=$0; 
    getline; output=sprintf("%s\n%s", output, $0); 
    getline; output=sprintf("%s\n%s", output, $0); 
    getline; 
    if (/[0-9]/) { 
    output=sprintf("%s\n%s\n", output, $0); 
    print output; 
    } 
} 

[[email protected] ~]$ ./doit input.txt 
BP 0 test: 
    case id   Name    
    ====== ======== ================= 
     0  82 a_case-2-0-0  

BP 1 test: 
    case id   Name    
    ====== ======== ================= 
     0  86 a_case-2-1-0  

BP 3 test: 
    case id   Name    
    ====== ======== ================= 
     0  93 a_case-2-3-0 

[[email protected] ~]$ 

Lưu ý rằng kịch bản này giả định một số điều về dữ liệu đầu vào của bạn. Nếu các điều kiện trong câu lệnh if không hoạt động với bạn hoặc nếu có khả năng xảy ra nhiều trường hợp sau một lần thử nghiệm, tập lệnh này sẽ cần được điều chỉnh.

+0

Câu trả lời của kev là cách thông minh hơn, nhưng điều này dễ hiểu hơn. – Graham

+0

er, um ... cảm ơn, tôi đoán .... – ghoti

+0

+1 ... tôi đã có chính xác cùng một ý tưởng trước khi tôi nhìn thấy câu trả lời ur .. – Vijay

0

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

sed 'N;N;N;$!N;/\n\n$/d' file 
Các vấn đề liên quan