Grepping дважды, используя результат первого Grep в большом файле - PullRequest
0 голосов
/ 08 апреля 2020

Мне предоставляется список, если идентификатор, который мне нужен для отслеживания имени в файле

file: идентификатор содержит

1
2
3
4
5
6

Идентификатор содержится в большом файле 2 ГБ, который называется result.txt

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

Таким образом, я помещаю файл идентификатора в переменную

Затем я использую эту переменную в al oop, чтобы получить значения для ссылки на имя, используя grep и вырезать -d из results.txt и вывести в переменную

, чтобы переменная содержала ABS CDE FG1

В том же l oop я передаю вывод grep для выполнения другого grep на results.txt, чтобы получить имя ie файл сожалений для AB C CDE FG1

Я получаю ответ, но требуется много времени, это более эффективный способ?

Спасибо

1 Ответ

2 голосов
/ 08 апреля 2020

Делая некоторые предположения о вашем требовании ... Идентификаторы, которые не найдены в большом файле, не будут отображаться в выходных данных; желаемый вывод в формате, показанном ниже.

Вот фиктивные входные файлы - 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.)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...