比较三个文件:使用列比较,行存在于一个文件中,但不存在于另一个文件中

比较三个文件:使用列比较,行存在于一个文件中,但不存在于另一个文件中

我有三个文件,,file1.txt它们具有相同的格式(具有相同数据类型的相同列数)。file2.txtfile3.txt

我想通过将第 2 列、第 3 列分别与输出文件 进行比较来选择file1.txt中不存在的记录file2.txt。你能帮我怎么做吗?file3.txtout.txt

输入示例:

file1.txt

abc 1 a f11 f13 f14 
abd 2 b f12 f14 f13  
abe 4 d f13 f16 f12 
acf 6 s f14 f15 f19

file2.txt

 abc 1 a f21 f23 f24 
 abd 1 b f21 f24 f23  
 abe 4 d f24 f26 f22 
 acf 6 s f23 f25 f29

file3.txt

 abc 1 a f31 f33 f34 
 abd 3 b f31 f34 f33  
 acf 6 s f33 f35 f39 
 abe 3 d f34 f36 f32

所需输出

out.txt

 abd 2 b f12 f14 f13 

除了这一行之外,其他行都存在于file2.txt,file3.txt

我发现这些帖子对工作很有用三个文件,比较两个文件。

答案1

如果你这么喜欢awk

awk '
FILENAME != ARGV[3] {
    m[$2,$3] = 1
    next
    }
!(($2,$3) in m)
' file3.txt file2.txt file1.txt > out.txt

对我来说很容易

cut -d" " -f 2,3 file2.txt file3.txt | grep -v -f - file1.txt > out.txt

答案2

可能的解决方案awk

awk 'FILENAME == ARGV[1] {
    m[$2,$3] = $0;
    next;
}
FILENAME == ARGV[2] {
    if (!(($2,$3) in m)) {
        m[$2,$3] = $0;
    }
    next;
}
{
    if (!(($2,$3) in m)) {
        print $0 >"out.txt";
    }
}' file3.txt file2.txt file1.txt

首先,我们读取第一个文件并创建包含第 2 列和第 3 列键的数组。
然后,我们读取第二个文件并检查第 2 列和第 3 列中的键是否存在于第一个数组中,如果不存在,我们将其添加到数组中。
最后,我们读取第一个文件,检查数组中是否存在键,如果不存在,那就是我们感兴趣的行。

输出.txt第一个文件中应包含其他两个文件中未出现的行:

abd 2 b f12 f14 f13

相关内容