Piping szukanego terminu (nie nazwa pliku) do grep

23

Chcę wybrać z pliku niektóre wiersze zawierające dany numer. Plik, który chcę wyszukać, nazywa się 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

Pierwsza część, przed potokiem, działa - tworzy wyszukiwane hasła, takie jak 8707, 8824 itd. Jednak druga część nie.

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

Zamiast przeszukiwać plik docelowy pod kątem terminów utworzonych przez potok, traktuje wyszukiwane hasła jako plik wejściowy. Dlatego otrzymuję komunikaty o błędach, takie jak:

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

Co muszę zmienić, aby wyszukać w pliku os_clusters/piRNA_clusters.bedterminy utworzone przez potok?

The Unfun Cat
źródło
stackoverflow.com/questions/6641731/...
Ciro Santilli 新疆 改造 中心 法轮功 六四 事件

Odpowiedzi:

35

Myślę, że chcesz

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

-fkaże grepuzyskać wzorzec wyszukiwania z pliku i -informuje go, że ten plik jest w rzeczywistości stdin (wyjście potoku w twoim przypadku).

Dzięki komentarzowi @ rici, do grepużytku innego niż GNU

... | grep -f /dev/stdin os_clusters/piRNA_clusters.bed
Joseph R.
źródło
Dzięki za wskazówkę, ale właśnie wyprodukowała:grep: -: No such file or directory
The Unfun Cat
8
Jeśli nie używasz gnu grep, spróbuj -f /dev/stdinzamiast-f -
rici
OS X 10.8 vel Mountain Lion
The Unfun Cat
6
Możesz także użyć <()składni bash :grep -f <(awk ...) os_clusters/piRNA_clusters.bed
rici