2017-12-15 7 views
0

I die Zeile enthalten "Will_Liu>" aus, wenn die massive_data.txt n < m oder n == 0 oder m == 0 fangen will, eine Zeitraum des Prototyps ist wie folgt.Paßziels Reihe mit SED oder grep

cat massive_data.txt 
Will_Liu> set Name.* xxx 
============================================ 
Id Name  Para  status    
============================================ 
1 name-1 xxxxx  OK     
2 name-2 xxxxx  OK 
3 name-3 xxxxx  Not_OK 
. ...  ....  OK 
. ...  ....  OK 
m name-m ....  Not_OK 
============================================ 
Total: m name attempted, n name set OK 

In dem obigen Code, der "m" und "n" sind variabel, wenn die n < m oder n == 0 oder m == 0, drucken die Zeilen enthalten " Will_Liu> "; Wenn n == m und beide! = 0, überspringe und ignoriere diese Situation.

Ich konnte einfach "grep" verwenden und "sed" Schlüsselpunkte wie die zu erreichen:

cat test.txt 
Will_Liu> set Name_group1 xxx 
============================================ 
Id Name  Para  status    
============================================ 
1 name-1 xxxxx  OK     
2 name-2 xxxxx  OK 
3 name-3 xxxxx  Not_OK 
============================================ 
Total: 3 name attempted, 2 name set OK 

Will_Liu> set Name_group2 yyy 
============================================ 
Id Name  Para  status    
============================================ 
1 name-4 xxxxx  OK     
2 name-5 xxxxx  Not_OK 
3 name-6 xxxxx  Not_OK 
============================================ 
Total: 3 name attempted, 1 name set OK 

I "Sed" und "grep" Befehl wie folgt verwenden:

sed -n "/Total: 3 name attempted,/p" test.txt 
Total: 3 name attempted, 2 name set OK 
Total: 3 name attempted, 1 name set OK 

grep -B 9 "Total: 3 name attempted" test.txt | sed -n '/Will_Liu>/p' 
Will_Liu> set Name_group1 xxx 
Will_Liu> set Name_group2 yyy 

in der grep Befehl ist die 9 3+ , die ist Basis auf das Format der Struktur, es ist ein fester Wert.

Wie kann ich vorstellen 2 variates die „m“ und „n“ zu definieren, und meinen Code verbessern, um Ergebnis aus massive_data.txt erwartet werden? Mein erwarten Ausgang:

Will_Liu> set Name1 xxx 
Will_Liu> set Name2 yyy 
Will_Liu> set Name3 zzz 
.   .  . 
.   .  . 
.   .  . 
+1

Bitte arbeiten Sie zur Klärung dieser Frage. Es gibt viele undefinierte Begriffe: zum Beispiel: "Zielzeile" oder "Sessellinie" oder "hinter Code" oder "die Zufallszahl". Wenn Sie gute Antworten wünschen, muss Ihr Schreiben klar und präzise sein. Lass uns nicht raten. – John1024

+0

Sorry für die Unannehmlichkeiten, die "Zielzeile" bedeutet "Will_Liu> Set Name. * Xxx", und die "hinter Code" bedeutet "oben", ich werde meine Frage neu zu schreiben. –

Antwort

2

Im Allgemeinen kann jede vorherige Zeile, die Sie passt ein anderes Muster gedruckt werden soll. In diesen Fällen ist es besser, den letzten zu druckenden Kandidaten zu speichern, und wenn Sie Ihren Zustand erreicht haben, entscheiden Sie, was damit zu tun ist. Zum Beispiel

awk '/^Will_Liu/{ 
     last_will=$0 
    } 

    /^Total/{ 
     m=$2; n=$5 
     if (m>n || (m==0 && n==0)) 
      print last_will 

    }' file 

In Fällen, in denen Sie wirklich keine Muster haben die letzten Kandidaten auszuwählen, zu drucken, und müssen Sie einige Zeilennummer entscheiden, nach einer mathematischen Operation auf angepassten Liniendaten zu drucken, dann könnten Sie Übergeben Sie eine Datei doppelt oder verwenden Sie tac, um die Eingabe zu invertieren oder alle letzten Zeilen in einem Hash-Array oder einem ähnlichen Ansatz zu behalten. Diese Ansätze könnten manchmal nicht effizient sein. Zum Beispiel mit Speichern aller Zeilen, die nicht für Ihren Fall empfohlen wird

awk '{ line[NR]=$0 } 

    /^Total/{ 
     m=$2; n=$5 
     if (m>n || (m==0 && n==0)) 
      print line[NR-(m+5)] 

    }' file 
+0

Vielen Dank, mein Herr. Mein Kollege gab mir eine neue Idee, um das Problem zu beheben. Wir können eine Richtung wechseln, um den Zielteil auszuwählen. grep "Will_Liu> \ | Name versucht," massive_Daten.txt | awk '{a [NR] = $ 0; if ($ 1 == "Gesamt:" && $ 2> $ 5 || $ 2 == 0) {drucke ein [NR-1]}} ' In diesem Code können wir die Zeile filtern, die "Will_Liu" oder "Name versucht" enthält , um dann die Reihe in "Will_Liu" zu beurteilen und auszuwählen –

Verwandte Themen