2017-01-30 11 views
-2

Я реализую командуGrep на другой файл через по конвейеру выхода из одного файла

awk '{if($2 == "1")print $1}' file1 

выход которого, я хотел бы трубу, Grep на другой файл, что-то вроде

awk '{if($2 == "1")print $1}' file1 | grep to file2 

Однако я не знаю о таком методе, который существует для соединения grep с другим файлом, любая помощь будет полезна. Благодаря

Мой file1 выглядит следующим образом

ENSG00000127527:I11 0 
ENSG00000086015:I6 0 
ENSG00000198336:I7 0 
ENSG00000127527:I12 0 
ENSG00000086015:I7 0 
ENSG00000198342:I1 0 
ENSG00000127527:I13 0 
ENSG00000086015:I8 0 
ENSG00000198342:I2 0 

и мой файл 2 выглядит следующим образом:

chrX 99892102 99893102 ENSG00000000003:I1 - 
chrX 99890744 99890965 ENSG00000000003:I2 - 
chrX 99890250 99890402 ENSG00000000003:I3 - 
chrX 99889027 99890027 ENSG00000000003:I4 - 
chrX 99888537 99888732 ENSG00000000003:I5 - 
chrX 99887566 99887983 ENSG00000000003:I6 - 
chrX 99885864 99886864 ENSG00000000003:I7 - 
chrX 99840145 99840227 ENSG00000000005:I1 + 
chrX 99847620 99848620 ENSG00000000005:I2 + 
chrX 99849145 99849257 ENSG00000000005:I3 + 
+3

Хороший вопрос будет иметь 1. небольшой набор данных образца, 2. ожидаемый выход с этого входа, 3. текущий код/​​вывод/сообщение об ошибках и 4. ваши мысли о том, почему все не работает. Перечитайте повторно http://stackoverflow.com/help/how-to-ask, http://stackoverflow.com/help/dont-ask, http://stackoverflow.com/help/mcve и, возможно, http : //stackoverflow.com/tour Удачи. – shellter

+1

Какое отношение к нескольким «$ 1»? то есть они являются альтернативными словами или что? Вам нужны примеры. – dawg

+0

Мы просто догадываемся о том, что вы подразумеваете под «Я бы хотел, чтобы трассировать grep на другой файл», поскольку все, что вы подразумеваете под этим, - это, по-видимому, то, что вы не можете сделать. Вам необходимо опубликовать несколько кратких, проверяемых образцов и ожидаемых результатов, чтобы помочь вам уточнить ваши требования. –

ответ

1

Ваш вопрос крайне неясна.

Однако вы можете использовать awk, чтобы grep строки в первом файле против строк во втором.

Дано:

$ cat /tmp/f1.txt 
Apple 1 
Pear 1 
Tomato 2 
Potato 2 
Cherry 1 
$cat /tmp/f2.txt 
Apple 
Pear 
Tomato 
Potato 
Cherry 

Вы можете сделать grep как проход против второго файла с линиями в первом так:

$ awk 'NR==FNR && $2==1 {arr[$1]} NR>FNR && $1 in arr{ print }' /tmp/f1.txt /tmp/f2.txt 
Apple 
Pear 
Cherry 
3

dawg's awk-only answer может быть все, что вам нужно, но обратиться к Вашему вопрос как заданный:

Ваш вопрос выглядит следующим образом: как я могу передать вывод команды как список условий поиска в grep позвонить?

Вы спрашиваете о прохождении вывода по трубопроводу, который, однако, работает только тогда, когда вход для поиска в не также передается grep через стандартный ввод (который, как любая команда получает входной трубопровод).

Учитывая, что ваша команда grep использует фактический файл в качестве входных данных (для поиска в) - file2 - трубопровод является вариант:

awk '{if($2 == "1")print $1}' file1 | grep -f /dev/stdin file2 

grep «s -f опция принимает поисковые термины как файл (к которому подразумевается логика ИЛИ: любая строка ввода, которая соответствует , любая строк в файле поисковых запросов считается match), и используя /dev/stdin в качестве имени файла, в качестве содержимого файла используется вывод awk.

Примечание: С GNUgrep, вы можете также использовать - вместо /dev/stdin, но BSD/MacOS grep не поддерживает это.


Следующие решения работают независимо от того, является ли вход для поиска в сам прошел через STDIN или нет:

В bash, ksh и zsh, самый простой способ обеспечить вывод комманд в если бы это был файл использовать process substitution (<(...)):

grep -f <(awk '{if($2 == "1")print $1}' file1) file2 

Тем не менее, в данном случае стороны, порога е grep предположительно должен прочитать весь файл, переданный -f в память первой в любом случае, следующий POSIX-совместимый эквивалент, который использует command substitution ($(...)), работает точно так же:

grep "$(awk '{if($2 == "1")print $1}' file1)" file2 

Однако последний бежит форма (гипотетический) риск превышения максимальной длины командной строки платформы, а первый - нет.