Делая некоторые предположения о вашем требовании ... Идентификаторы, которые не найдены в большом файле, не будут отображаться в выходных данных; желаемый вывод в формате, показанном ниже.
Вот фиктивные входные файлы - f1
для идентификаторов и f2
для большого файла:
[mathguy@localhost test]$ cat f1
1
2
3
4
5
6
[mathguy@localhost test]$ cat f2
ABC=John,dhds,72828,73737,3939,92929
CDE=John,uubad,32424,ajdaio,343533
FG1=Peter,iasisaio,097282,iosoido
WER=Ann,97391279,89719379,7391739
result,**id=1**,iuhdihdio,ihwoihdoih,iuqhwiuh,ABC
result2,**id=2**,9729179,hdqihi,hidqi,82828,CDE
result3,**id=3**,biasi,8u9829,90u209w,jswjso,FG1
Предлагаемое решение и вывод :
[mathguy@localhost test]$ sed 's/.*/\*\*id=&\*\*/' f1 | grep -Ff - f2 | \
> sed -E 's/^.*\*\*id=([[:digit:]]*)\*\*.*,([^,]*)$/\1 \2/'
1 ABC
2 CDE
3 FG1
Большую работу здесь выполняет grep -F
, которая может быть достаточно быстрой для ваших нужд. sed
есть некоторая подготовительная работа и некоторая работа по очистке, но обе они выполняются для небольших наборов данных.
Сначала мы берем идентификаторы из входного файла и выводим строки в формате **id=<number>**
, Выходные данные представляются в виде шаблонов с фиксированными символами в grep -F
через опцию -f
(взять шаблоны из файла, в данном случае из stdin, вызванного как -
; то есть из вывода sed
) .
После того, как мы находим нужные строки из большого файла, окончательный sed
просто извлекает идентификатор и имя из каждой строки.
Примечание: это предполагает, что каждый идентификатор найден только однажды в большом файле. (На самом деле команда будет работать независимо; но если для идентификатора есть повторяющиеся строки, ваши бизнес-пользователи должны будут рассказать вам, как обращаться с ними. Что если вы получите противоречивые имена для одного и того же идентификатора? Et c.)