2016-06-03 1 views
3

J'ai cette chaîne de commande qui a parfaitement fonctionné sous OS X 10.6.8 (Snow Leopard) (qui me dit que son grep est grep (GNU grep) 2.5.1) ...Modèle de recherche de tuyaux à BSD grep

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

(Trouver toutes les lignes avec TERM en eux fichier1, couper chaque vers le numéro d'identification unique dans le champ 3, puis regardant ces ID dans fichier2)

Et pourtant ce ne parvient dans OS X 10.11.5 (El Capitan) (qui me dit que son grep est grep (grep BSD) 2.5.1-FreeBSD) ...

grep: -: No such file or directory 

Je ne veux vraiment pas installer GNU grep sur cette machine. Existe-t-il un moyen de corriger la deuxième commande grep pour que BSD grep fonctionne? Ou une meilleure façon de s'y prendre généralement?

Quelques exemples de code:

file1.txt ressemblerait à ceci:

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

file2.txt comme:

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

Répondre

2

- se réfère généralement à stdin ou stdout, -f cherchera B pour les lignes de A:

grep -f A B 

<(...) (appelé process substitution) fera un "fichier" avec la sortie de ...:

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

Vous pouvez avec cette connaissance changer les commandes à:

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

Et AWK:

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

Et alternative comme suggéré par @fedorqui, mais modifié pour ne pas utiliser gawk's IGNORECASE. Notez que les fichiers sont lus file2.txtfile1.txt

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

Merci pour ce motif grep. Cela fonctionne avec GNU ou BSD grep. Les deux fichiers ont environ 750k lignes. GNU grep terminé en 33 secondes; BSD grep a fonctionné pendant 4 minutes et ne m'a toujours pas montré le premier résultat. Si rien d'autre, votre code si bien fourni m'a convaincu que BSD grep est de la merde. –

+0

L'awk de @ andlrc semble fonctionner mais celui de @fedorqui ne semble pas fonctionner. –

+0

@fedorqui J'apprécie le temps que vous avez passé là-dessus. Mais même après avoir revérifié que file2 précède le fichier 1 ... cela ne semble pas fonctionner. –