比较 2 个文件并显示匹配的记录

比较 2 个文件并显示匹配的记录

我真的需要你们的帮助,伙计们,我是 Unix 新手。我想将 File2(3 列)与 File1(原始数据)进行比较,并将结果保存在新文件中。但我的文件有不同的分隔符。

例子:

File1 (in tab delimited)
Col1    Col2    Col3    Col4    Col5
a       1       JJ      KK      DD
b       2       TT      RR      EE
c       3       QQ      ZZ      PP

File2 (in pipe delimited)
Col1    Col2    Col3
b       TT      RR
c       QQ      ZZ

Result
Col1    Col2    Col3    Col4    Col5
b       2       TT      RR      EE
c       3       QQ      ZZ      PP

请注意,我的文件很大,我需要快速执行的代码。我需要匹配 file2 的第 3 列才能匹配 file1。多谢!

答案1

命令

u=`awk 'NR==1{print $0}' fil1`

awk -v u="$u"  'BEGIN {print u}NR==FNR{a[$3];next}($4 in a){print $0}' fil2 fil1

输出

Col1    Col2    Col3    Col4    Col5
b       2       TT      RR      EE
c       3       QQ      ZZ      PP

答案2

您可以对它们进行排序(1),重新格式化以使用相同的分隔符(例如 sed(1)),并通过执行自定义匹配的程序处理结果(我会在 perl(1) 中编写它,但是有有很多选择,也许今天 Python 更熟悉)。

答案3

你没有说你想在 file1 中匹配什么(一列、整行、正则表达式、字符串、部分或完整等),所以这是一个猜测,但也许这就是你想要做的( file1 第 4 列与 file2 第 3 列的全字段字符串匹配):

$ awk 'NR==FNR{a[$3]; next} (FNR==1) || ($4 in a)' FS='[|]' file2 FS='\t' file1
Col1    Col2    Col3    Col4    Col5
b       2       TT      RR      EE
c       3       QQ      ZZ      PP

或者可能是这样(按顺序比较 file2 中的所有列与全字段字符串匹配中 file2 中的 3 个特定列):

$ awk 'NR==FNR{a[$1,$2,$3]; next} (FNR==1) || (($1,$3,$4) in a)' FS='[|]' file2 FS='\t' file1
Col1    Col2    Col3    Col4    Col5
b       2       TT      RR      EE
c       3       QQ      ZZ      PP

但还有数十种其他可能性。您提供的示例的问题在于,根据您发布的示例输入,有很多匹配组合可以产生预期的输出。

答案4

使用 Perl 的一种方法可以是:

 $ perl -F'\t' -lane '$"="|";
     $h{$_}++,next if @ARGV;
     print if $h{"@F[0,2,3]"};
 ' File2 File1

首先读入 File2 并用 file2 的行填充哈希键,记住包含管道符号。

然后读取 file1 并尝试匹配其字段 0、2 和 3,在选项卡上拆分并通过管道连接。对于一场比赛,获得记录。

相关内容