比较两个不同长度的文件之间的公共值 (Linux)

Comparing Common Values between two files of different length (Linux)

我比较了两个不同长度的文件,我首先找到了文件 1 中存在但文件 2 中没有的唯一 ID。

但是,现在我想找到文件之间的共同唯一值,我已经多次看到 comm 命令的使用,但是,这些文件的长度不同。

例子

文件 1:

2 
4 
6 
8 
10

文件 2:

9
8
7
6
5
4
3
2
1

期望输出:

2 
4 
6 
8 

为了寻找独特的差异,我使用了以下命令:

awk 'FNR==NR {a[[=14=]]++; next} !([=14=] in a)' file1.sorted file2.sorted > diff_values.txt

为了寻找共同价值观,我尝试使用以下命令,但我不完全确定这是否是正确的方法,或者是否存在任何替代方法:

comm -12 file1.sorted file2.sorted > comm_values.txt

使用 comm 有很多替代方法,就像在 Unix 中做任何事情都有很多替代方法一样,但是 comm 是专为满足您的要求而设计的工具。

常用线路:

$ comm -12 <(sort file1) <(sort file2)
2
4
6
8

不同行:

$ comm -3 <(sort file1) <(sort file2)
        1
10
        3
        5
        7
        9

仅在第一个文件中的行数:

$ comm -23 <(sort file1) <(sort file2)
10

仅在第二个文件中的行:

$ comm -13 <(sort file1) <(sort file2)
1
3
5
7
9

如果您想要替代方案,这里有一些您可以考虑并根据您的需要进行调整的替代脚本:

$ awk 'NR==FNR{a[[=14=]]; c[[=14=]]; next} {b[[=14=]]; c[[=14=]]} END{for (i in c) if ((i in a) && (i in b)) print i}' file1 file2
2
4
6
8

$ awk 'NR==FNR{a[[=14=]]; c[[=14=]]; next} {b[[=14=]]; c[[=14=]]} END{for (i in c) if (!((i in a) && (i in b))) print i}' file1 file2
1
3
5
7
9
10

$ awk 'NR==FNR{a[[=14=]]; c[[=14=]]; next} {b[[=14=]]; c[[=14=]]} END{for (i in c) if ((i in a) && !(i in b)) print i}' file1 file2
10

$ awk 'NR==FNR{a[[=14=]]; c[[=14=]]; next} {b[[=14=]]; c[[=14=]]} END{for (i in c) if (!(i in a) && (i in b)) print i}' file1 file2
1
3
5
7
9