比较两个文本文件中的列并匹配行

时间:2016-03-28 20:02:15

标签: bash awk text-files text-processing

我想比较file1中的第二列(用空格分隔):

n01443537/n01443537_481.JPEG n01443537
n01629819/n01629819_420.JPEG n01629819
n02883205/n02883205_461.JPEG n02883205

使用file2中的第二列(由空格分隔):

val_8447.JPEG n09256479
val_68.JPEG n01443537
val_1054.JPEG n01629819
val_1542.JPEG n02883205
val_8480.JPEG n03089624

如果匹配,我想打印出相应的file2行。

此示例中的所需输出:

val_68.JPEG n01443537
val_1054.JPEG n01629819
val_1542.JPEG n02883205

我尝试了以下操作,但输出文件为空:

awk -F' ' 'NR==FNR{c[$2]++;next};c[$2] > 0' file1.txt file2.txt > file3.txt

也尝试了这个,但结果是相同的(空输出文件):

awk 'NR==FNR{a[$2];next}$2 in a' file1 file2 > file3.txt

2 个答案:

答案 0 :(得分:2)

为此目的存在GNU join

join -o "2.1 2.2" -j 2 <(sort -k 2 file1) <(sort -k 2 file2)

答案 1 :(得分:1)

使用awk:

awk 'FNR==NR{a[$NF]; next} $NF in a' file1 file2

val_68.JPEG n01443537
val_1054.JPEG n01629819
val_1542.JPEG n02883205

以下是具有流程替换的grep替代方案:

grep -f <(awk '{print " " $NF "$"}' file1) file2

使用print " " $NF "$"创建类似" n01443537$"的正则表达式,以便我们仅匹配grep中的最后一列。