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

2024-04-19 09:26:00 发布

您现在位置:Python中文网/ 问答频道 /正文

文件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(我对此非常陌生)。你知道吗


Tags: 文件comnetgmailhermanannajohnsonbrown
2条回答

你能试试下面的吗。你知道吗

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
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中的模式

相关问题 更多 >