![比较 2 个文件并显示匹配的记录](https://linux22.com/image/155775/%E6%AF%94%E8%BE%83%202%20%E4%B8%AA%E6%96%87%E4%BB%B6%E5%B9%B6%E6%98%BE%E7%A4%BA%E5%8C%B9%E9%85%8D%E7%9A%84%E8%AE%B0%E5%BD%95.png)
我真的需要你们的帮助,伙计们,我是 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,在选项卡上拆分并通过管道连接。对于一场比赛,获得记录。