2016-06-03 5 views
3

ich diese Befehlsfolge haben, die sehr gut in OS X 10.6.8 (Snow Leopard) gearbeitet (die mir sagt, seine grep ist grep (GNU grep) 2.5.1) ...Rohrsuchmuster BSD grep

$ grep -hi 'TERM' file1.txt | cut -d '|' -f 3 | grep -f - file2.txt 

(Finden sie alle Zeilen mit TERM in ihnen in file1, je 3 bis auf die eindeutige ID-Nummer im Feld schneiden, dann die IDs in file2 aufzublicken)

Und doch ist diese nicht in OS X 10.11.5 (El Capitan) (was mir seine Grep sagt, ist Grep (BSD grep) 2.5.1-FreeBSD) ...

grep: -: No such file or directory 

Ich möchte wirklich nicht GNU Grep auf diesem Rechner installieren. Gibt es eine Möglichkeit, den zweiten grep-Befehl zu reparieren, damit BSD grep funktioniert? Oder ein besserer Weg, um generell vorzugehen?

Einige Codebeispiel:

file1.txt würde wie folgt aussehen:

Jones Inc||000123||foo||bar 
TerminatorLLC||000124||foo||bar 
Conan LP||000125||foo||bar 
Termites-R-Us||000126||foo||bar 

file2.txt wie:

000123||210 Main Street||moo||car 
000124||Los Angeles||moo||car 
000125||Mythical Kingdom||moo||car 
000126||Your Woodwork||moo||car 

Antwort

2

- in der Regel auf stdin oder stdout bezieht, wird -f B suchen für Linien von A:

grep -f A B 

<(...) (genannt process substitution) wird eine "Datei" machen mit der Ausgabe von ...:

% echo <(ls) 
/dev/fd/63  

Sie können mit diesem Wissen, um die Befehle ändern:

grep -f <(grep -hi 'TERM' file1.txt | cut -d '|' -f 3) file2.txt 

Und in AWK:

awk -F'|' 'NR == FNR { if (/[tT][eE][rR][mM]/) a[$3] = 1; next }a[$1]' file1.txt file2.txt 

Und Alternative wie vonvorgeschlagen, aber geändert, um gawk's IGNORECASE nicht zu verwenden. Beachten Sie, dass die Dateien file2.txtfile1.txt

awk -F'|' 'NR == FNR { a[$1] = $0; next } /[tT][eE][rR][mM]/ { print a[$3] }' file2.txt file1.txt 
+0

Sie für dieses grep Muster danken gelesen werden. Es funktioniert mit GNU oder BSD Grep. Beide Dateien sind etwa 750k Zeilen. GNU Grep endete in 33 Sekunden; BSD grep läuft seit 4 Minuten und hat mir immer noch nicht das erste Ergebnis gezeigt. Wenn nichts anderes, Ihr so ​​freundlich zur Verfügung gestellt Code hat mich davon überzeugt, dass BSD Grep ist Mist. –

+0

Das awk von @ andlrc scheint zu funktionieren, aber das von @fedorqui scheint nicht. –

+0

@fedorqui Ich schätze die Zeit, die du damit verbracht hast. Aber selbst nach der Überprüfung geht Datei2 der Datei 1 voraus ... es scheint nicht zu funktionieren. –