2012-04-12 5 views
6

ich eine Datei mit folgenden Ausgang haben:Gibt es eine Möglichkeit, ein solches Muster mit Shell oder Sed zu vergleichen?

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 

so, nur "BP 0,1,3" haben Inhalt, also was ich will, ist, ist es möglich, 'BP 0 test' dump 'BP 1 Test 'und' BP 3 Test 'nur, wollen nur den' BP 2 Test 'wegen kein Testfall ingore.

Danke für Ihre Hilfe.

+0

Sie für diese awk wollen. –

+1

Was hast du probiert? Es ist schwer, mit Ihrem Code zu helfen, wenn Sie ihn nicht in Ihre Frage aufnehmen. – Graham

Antwort

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, sehr nett. :-) – ghoti

+0

es ist sehr gut für mich. – user1110921

+0

Ich liebe dieses 'RS = '' 'Idiom mit awk. Ein weiterer Grund, den Perl-Vorschlaghammer im Keller zu lassen. –

2

Wenn Ihr grep -B-Option unterstützt, dann können Sie dieses tun

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

der Ausgang für die oben ist

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

Hier -B3 druckt 3 Zeilen über dem Übereinstimmungsmuster.

3

Während Sie etwas zusammen kleinere Shell-Tools Whack könnten wie [ und expr, wird es viel einfacher sein, dies zu tun mit awk, denen Sie in der Regel in jedem Betriebssystem finden, das auch grep und sed enthält. :)

Hier ist eine schnelle und unsaubere:

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

Beachten Sie, dass dieses Skript einige Dinge über Ihre Eingangsdaten annimmt. Wenn die Bedingungen in der if-Anweisung nicht für Sie funktionieren oder wenn nach einem einzelnen Test mehrere Fälle auftreten können, muss dieses Skript angepasst werden.

+0

Kevs Antwort ist viel schlauer, aber diese ist leichter zu verstehen. – Graham

+0

er, ähm ... danke, ich denke .... – ghoti

+0

+1 ... ich habe genau die gleiche Idee, bevor ich sehe deine Antwort .. – Vijay

0

Dies könnte für Sie arbeiten:

sed 'N;N;N;$!N;/\n\n$/d' file 
Verwandte Themen