Leite den Suchbegriff (nicht den Dateinamen) an grep weiter

23

Ich möchte bestimmte Zeilen mit einer bestimmten Nummer aus einer Datei auswählen. Die zu durchsuchende Datei heißt os_clusters/piRNA_clusters.bed.

awk '{if (a[$0]++ == 0) {split($0,b,"."); ;split(b[1],c,"r"); print c[3]}};' test_non_enriched | xargs grep {} os_clusters/piRNA_clusters.bed

Der erste Teil, bevor die Pipe funktioniert, erstellt die zu suchenden Begriffe wie 8707, 8824 usw. Der letzte Teil funktioniert jedoch nicht.

awk '' ... | xargs grep {} os_clusters/piRNA_clusters.bed

Anstatt die Zieldatei nach den von der Pipe erzeugten Begriffen zu durchsuchen, werden die Suchbegriffe als Eingabedatei betrachtet. Daher erhalte ich Fehlermeldungen wie:

grep: 8707: No such file or directory
grep: 8824: No such file or directory

Was muss ich ändern, um die Datei os_clusters/piRNA_clusters.bednach den von der Pipe erzeugten Begriffen zu durchsuchen ?

Die unfun Katze
quelle

Antworten:

35

Ich denke du willst

... | grep -f - os_clusters/piRNA_clusters.bed

-fTells grep, um sein Suchmuster aus einer Datei zu erhalten, und -teilt ihm mit, dass diese Datei tatsächlich stdin ist (in Ihrem Fall die Ausgabe der Pipe).

Dank @ rici Kommentar, für Nicht-GNU grepNutzung

... | grep -f /dev/stdin os_clusters/piRNA_clusters.bed
Joseph R.
quelle
Danke für den Tipp, aber er hat gerade produziert:grep: -: No such file or directory
The Unfun Cat
8
Wenn Sie -f /dev/stdin-f -
gnu
OS X 10.8 aka Mountain Lion
Die lustige Katze
6
Sie können auch die Bash- <()Syntax verwenden:grep -f <(awk ...) os_clusters/piRNA_clusters.bed
rici