Canalizando o termo de pesquisa (não o nome do arquivo) para grep

23

Quero escolher certas linhas que contêm um determinado número de um arquivo. O arquivo que eu quero pesquisar é chamado 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

A primeira parte, antes do tubo, funciona - produz os termos a serem pesquisados, como 8707, 8824 etc. No entanto, a segunda parte não.

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

Em vez de procurar no arquivo de destino os termos produzidos pelo canal, ele considera os termos de pesquisa como o arquivo de entrada. Portanto, recebo mensagens de erro como:

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

O que preciso alterar para pesquisar no arquivo os_clusters/piRNA_clusters.bedos termos produzidos pelo canal?

The Unfun Cat
fonte

Respostas:

35

Eu acho que você quer

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

-finstrui greppara obter seu padrão de pesquisa de um arquivo e -informa que esse arquivo é realmente stdin (a saída do canal no seu caso).

Graças ao comentário de @ rici, pelo grepuso não-GNU

... | grep -f /dev/stdin os_clusters/piRNA_clusters.bed
Joseph R.
fonte
Obrigado pela dica, mas ela acabou de produzir:grep: -: No such file or directory
The Unfun Cat
8
Se você não está usando o GNU grep, tente -f /dev/stdinem vez de-f -
rici
OS X 10.8 tcp Mountain Lion
The Unfun Cat
6
Você também pode usar a <()sintaxe do bash :grep -f <(awk ...) os_clusters/piRNA_clusters.bed
rici