Совпадение нескольких столбцов в двух файлах - вывод только тех, которые полностью соответствуют - PullRequest
0 голосов
/ 27 мая 2019

Файл 1:

1075908|2178412|brown_eyeshorty@att.net|Claude|Desmangles
175908|2178412|naim.kazi@webtv.net|Naim|Kazi
175972|212946872418|gil_maynard@hotmail.com|Munster|Herman
175972|212946872418|meghanj4@lycos.com|Meghan|Judge
175972|212946872418|quenchia@gmail.com|Anna|Balint
176046|255875|keion@netscape.net|Charlene|Johnson
176046|255875|keion112@netscape.net|Charlene|Johnson
176086|2480881|lourdsneil@gmail.com|Lourds|Herman

Файл 2:

89129090|Sadiq|Islam
212946872418|Anna|Balint
255875|Charlene|Johnson
89234902|Bob|Brown
09123789|Fabio|Vanetti

Я хотел бы извлечь строки, в которых ВСЕ значения совпадают на следующей основе:

  • Столбец 2 в файле 1 соответствует столбцу 1 в файле 2.
  • Столбец 4 в файле 1 соответствует столбцу 2 в файле 2.
  • Столбец 5 в файле 1 соответствует столбцу 3 в файле2.

Ожидаемый вывод для примера:

175972|212946872418|quenchia@gmail.com|Anna|Balint
176046|255875|keion@netscape.net|Charlene|Johnson
176046|255875|keion112@netscape.net|Charlene|Johnson

Оба входа, с которыми я работаю, очень большие (11 ГБ и 3 ГБ соответственно).

Единственный возможный (грязный) обходной путь, о котором я могу подумать, - это объединить значения, которые нужно объединить, в один дополнительный столбец и затем использовать Join (я очень новичок в этом).

Ответы [ 2 ]

2 голосов
/ 27 мая 2019
grep -f <(sed 's,|,|[^|]*|,' file2) file1

Возвращает

175972|212946872418|quenchia@gmail.com|Anna|Balint
176046|255875|keion@netscape.net|Charlene|Johnson
176046|255875|keion112@netscape.net|Charlene|Johnson

Пояснения:

Первая команда:

sed 's,|,|[^|]*|,' file2

Преобразует файл2 в список шаблонов для поиска в файле 1 и возвращает:

89129090|[^|]*|Sadiq|Islam
212946872418|[^|]*|Anna|Balint
255875|[^|]*|Charlene|Johnson
89234902|[^|]*|Bob|Brown
09123789|[^|]*|Fabio|Vanetti

Вторая команда:

grep -f <(command1) file1

Поиск шаблонов в файле1

1 голос
/ 27 мая 2019

Не могли бы вы попробовать следующее.

awk -F'|' '
FNR==NR{
    a[$2,$4,$5]=(a[$2,$4,$5]?a[$2,$4,$5] ORS:"")$0
    next
}
(($1,$2,$3) in a){
    print a[$1,$2,$3]
}' Input_file1   Input_file2

Вывод будет следующим.

175972|212946872418|quenchia@gmail.com|Anna|Balint
176046|255875|keion@netscape.net|Charlene|Johnson
176046|255875|keion112@netscape.net|Charlene|Johnson
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...