2016-09-11 6 views
2

Ich habe Datei mit Text, zBcat-Datei - falls vorhanden „Worte“ Druckzeile oben „Worte“

######## cat file.txt 
aaaa 

bbbb 

cccc 

dddd 
From CN Country 

eeee 

ffff 
From UK Country 

gggg 

............ 

Nun, wenn in der Datei das Wort „Land“ auftritt, drucken Sie nur die Zeile oben zB das Wort

####### some magic command print 
dddd 
ffff 

ich denke, dass ich dafür verwenden könnte:

  • awk – wie: awk '/Country/{found=0} {if(found) print} //{found=1}' file.txt – ohne Erfolg, und alle mit dieser Option mir die Kombination bekannt:/
  • sed – wie: sed -n '1,/Country/p' file.txt – wie oben

Kann mir jemand helfen? :)

Antwort

3

Mit awk:

awk '/Country/ {print previous}; {previous=$0}' file.txt 

Beispiel:

$ cat file.txt 
aaaa 

bbbb 

cccc 

dddd 
From CN Country 

eeee 

ffff 
From UK Country 

gggg 

$ awk '/Country/ {print previous}; {previous=$0}' file.txt 
dddd 
ffff 
+0

Jesus Christus so eine Banalität: D - Danke @heemayl! :) – Najkon

+1

@EdMorton Fertig .. danke. – heemayl

+0

Gern geschehen. FYI obwohl POSIX sagt, dass Sie ein '' 'nach einem Aktionsblock brauchen, tun Sie das nicht. Kein awk erfordert dies oder wird es jemals tun, da die meisten awk-Skripte es nicht tun und daher brechen würden, wenn es jemals benötigt würde. –

1
$ grep -B 1 Country foo|grep -v "Country\|--" 
dddd 
ffff 
  • -B 1Druck 1 Linie führenden Kontext
  • -v--invert-match
  • "Country\|--"\| entkam OR
2

Dies könnte für Sie arbeiten (GNU sed):

sed -n 'N;/\n.*Country/P;D' file 

Verwenden Sie den grep-wie Schalter -n und zwei Zeilen in dem Musterraum lesen, Drucken der ersten, wenn die zweite das Wort Country enthält.

0
sed -n '/Country/{x;p};x' tmp 

-n -> unterdrücken automatische Drucken von Musterraum

x -> das Muster Swap- und Raum zu halten, so dass die vorhergehende Zeile im Puffermusterraum ist.

p -> vorherige Zeile drucken (was war der Speicherplatz).

; x -> Wenn die Zeile kein Land enthält, dann tauschen Sie sie aus und wiederholen Sie das Muster.