Шаблон поиска конвейера в BSD grep

У меня есть эта командная строка, которая отлично работала в OS X 10.6.8 (Snow Leopard) (что говорит мне, что ее grep - это grep (GNU grep) 2.5.1)...

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

(Нахождение всех строк с TERM в них в файле 1, сокращение каждой из них до уникального идентификационного номера в поле 3, а затем поиск этих идентификаторов в файле 2)

И все же это не работает в OS X 10.11.5 (El Capitan) (что говорит мне, что его grep - это grep (BSD grep) 2.5.1-FreeBSD)...

grep: -: No such file or directory

Я действительно не хочу устанавливать GNU grep на эту машину. Есть ли способ исправить вторую команду grep, чтобы BSD grep работал? Или лучший способ сделать это в целом?

Некоторый пример кода:

file1.txt будет выглядеть так:

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

file2.txt как:

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

person Darryl Daugherty    schedule 03.06.2016    source источник


Ответы (1)


- обычно относится к стандартному вводу или стандартному выводу, -f будет искать в B строки из A:

grep -f A B

<(...) (называемый подстановкой процесса) создаст "файл " с выводом ...:

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

С этими знаниями вы можете изменить команды на:

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

И в АВК:

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

И альтернатива, предложенная @fedorqui, но измененная, чтобы не использовать gawk IGNORECASE. Обратите внимание, что файлы читаются file2.txt file1.txt

awk -F'|' 'NR == FNR { a[$1] = $0; next } /[tT][eE][rR][mM]/ { print a[$3] }' file2.txt file1.txt
person andlrc    schedule 03.06.2016
comment
Спасибо за этот шаблон grep. Он работает как с GNU, так и с BSD grep. Оба файла содержат около 750 тыс. строк. GNU grep завершил работу за 33 секунды; BSD grep работает уже 4 минуты и до сих пор не показал мне первого результата. По крайней мере, ваш так любезно предоставленный код убедил меня, что BSD grep - дерьмо. - person Darryl Daugherty; 03.06.2016
comment
awk от @andlrc, кажется, работает, но от @fedorqui, похоже, нет. - person Darryl Daugherty; 03.06.2016
comment
@fedorqui Я ценю время, которое вы потратили на это. Но даже после повторной проверки того, что файл 2 предшествует файлу 1... похоже, это не работает. - person Darryl Daugherty; 03.06.2016