2017-04-22 1 views
0

Ich weiß, dass wenn ich eine Datei von Mustern haben kann ichWie mehrere Muster entsprechen, aber jeder nur einmal

grep -f pat_file search_file 

normalerweise die Datei zu suchen. Wie würden Sie diese Aufgabe ausführen, damit der Befehl jedes Muster nur einmal durchsucht?

Ich bin auf der Suche nach Effizienz, also könnte es sein, dass das Schreiben eines Python-Programms der effizienteste Weg ist, aber ich wette, dass da draußen etwas ist.

+2

Ich denke nicht, dass es mit Grep möglich ist ... fügen Sie bitte Beispieleingabe für beide Dateien und erwartete Ausgabe hinzu – Sundeep

Antwort

0

Ich würde dies in awk tun:

FNR == NR { pattern[NR] = $0; next } 

{ 
    for (i in pattern) { 
     if ($0 ~ pattern[i]) { 
      print 
      delete pattern[i] 
      continue 
     } 
    } 
} 

wie folgt aufgerufen werden:

awk -f script.awk patterns infile 

wo patterns Ihre Muster enthält und infile ist die Datei, die Sie suchen möchten.

Der erste Befehl liest die Muster in ein Array; Der zweite Befehl (nur für Dateien nach der ersten Datei ausgeführt) führt eine Schleife über die Muster, druckt übereinstimmende Linien, löscht das Muster aus dem Array und überspringt den Rest der Muster.

Ein Beispiel Eingabe von

line with pattern1 
another line with pattern1 
line with pattern2 
pattern1 again 
pattern3 now 
and pattern2 

und einer Pattern-Datei

pattern1 
pattern2 
pattern3 

die Ausgabe

$ awk -f script.awk patterns infile 
line with pattern1 
line with pattern2 
pattern3 now 

zu optimieren, Ihnen einen Scheck nach der delete Anweisung hinzufügen könnte Sehen Sie, ob irgendwelche Muster übrig sind, und verlassen Sie, wenn nicht.

0

Dies kann das sein, was Sie suchen:

awk ' 
NR==FNR { regexps[$0]; next } 
{ 
    found = 0 
    for (regexp in regexps) { 
     if ($0 ~ regexp) { 
      found = 1 
      delete regexps[regexp] 
     } 
    } 
} 
found 
' pat_file search_file 

aber da Sie jeden prüfbare Abtastwerteingang nicht zur Verfügung gestellt haben und die erwarteten Ausgang, es ist nur eine ungetestete Vermutung.

Übrigens - verwenden Sie nie das Wort "Muster", um zu beschreiben, welche Art der Übereinstimmung Sie wollen, da es mehrdeutig ist, verwenden Sie "string" oder "regexp", was auch immer Sie wirklich meinen.

Verwandte Themen