匹配两个文件中的多列-仅输出完全匹配的列

时间:2019-05-27 08:46:11

标签: python join awk

文件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

我想在以下基础上提取所有值都匹配的行:

  • 文件1中的第2列与文件2中的第1列匹配。
  • 文件1中的第4列与文件2中的第2列匹配。
  • 文件1中的第5列与文件2中的第3列匹配。

该示例的预期输出为:

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

我正在使用的两个输入都非常大(分别为11Gb和3Gb)。

我能想到的唯一可能的(混乱的)解决方法是将要连接的值合并到一个单独的附加列中,然后使用Join(对此我很陌生)。

2 个答案:

答案 0 :(得分:1)

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

将file2转换为模式列表以在文件1中搜索并返回:

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

第二条命令:

grep -f <(command1) file1

搜索文件1中的模式

答案 1 :(得分:1)

请您尝试以下。

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