2012-04-12 14 views
6

aşağıdaki çıkışı ile bir dosya var:Bu deseni kabuk veya sed ile eşleştirmek için bir yol var mı?

yüzden
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 

, sadece "BP 0,1,3" içeriğe sahip, bu yüzden olduğunu ne istediğini, 'mümkün 'BP 0 Test' dökümü BP ise Sadece 1 test 've' BP 3 testi ', sadece test durumu olmadığı için' BP 2 testini 'yapmak istiyoruz. Yardımlarınız için

teşekkürler. senin grep -B seçeneği destekliyorsa

+0

Bunun için awk istiyorum. –

+1

Ne denediniz? Sorunuza eklemezseniz kodunuza yardımcı olmak zordur. – Graham

cevap

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, çok güzel teşekkürler. :-) – ghoti

+0

benim için çok iyi. – user1110921

+0

Ben bu 'RS =' 'awk ile deyim seviyorum. Perl balyozunu bodrumda terk etmenin bir başka nedeni. –

2

o zaman yukarıdaki bu

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

çıkışı gibi yapabileceği Burada

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

-B3 baskılar eşleşen deseni üzerinde 3 satır. Birlikte [ ve expr gibi küçük kabuk araçlarını kullanarak birşeyler öldürürler iken

3

, genellikle de grep ve sed içeren herhangi bir işletim sisteminde bulacağınız awk kullanarak Bunu yapmanın yolu daha kolay olur. Bu komut dosyası, veri girişi ile ilgili bazı şeyler varsayar

[[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] ~]$ 

Not: :)

İşte kirli hızlı ve-bu. if ifadesindeki koşullar sizin için işe yaramıyorsa veya tek bir testten sonra birden fazla vaka olasılığı varsa, bu komut dosyasının ayarlanması gerekir.

+0

kev'in cevabı çok daha zekice, ama bu daha kolay anlaşılır. – Graham

+0

er, um ... teşekkürler, sanırım .... – ghoti

+0

+1 ... ben aynı cevabı görmeden önce tam olarak aynı fikir var .. – Vijay

0

Bu sizin için işe yarayabilecek:

sed 'N;N;N;$!N;/\n\n$/d' file 
İlgili konular