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

Posted

技术标签:

【中文标题】比较不同长度的两个文件之间的共同值(Linux)【英文标题】:Comparing Common Values between two files of different length (Linux) 【发布时间】:2021-11-14 06:21:56 【问题描述】:

我比较了两个不同长度的文件,我首先发现了文件 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[$0]++; next !($0 in a)' file1.sorted file2.sorted > diff_values.txt

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

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

【问题讨论】:

a[$0]++ 中的 ++ 除了占用 CPU 周期和可能的内存之外什么都不做。 【参考方案1】:

使用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==FNRa[$0]; c[$0]; next b[$0]; c[$0] ENDfor (i in c) if ((i in a) && (i in b)) print i' file1 file2
2
4
6
8

$ awk 'NR==FNRa[$0]; c[$0]; next b[$0]; c[$0] ENDfor (i in c) if (!((i in a) && (i in b))) print i' file1 file2
1
3
5
7
9
10

$ awk 'NR==FNRa[$0]; c[$0]; next b[$0]; c[$0] ENDfor (i in c) if ((i in a) && !(i in b)) print i' file1 file2
10

$ awk 'NR==FNRa[$0]; c[$0]; next b[$0]; c[$0] ENDfor (i in c) if (!(i in a) && (i in b)) print i' file1 file2
1
3
5
7
9

【讨论】:

感谢您提供如此详细的答案@Ed 绝对有效并涵盖了我需要的内容

以上是关于比较不同长度的两个文件之间的共同值(Linux)的主要内容,如果未能解决你的问题,请参考以下文章

长阵列性能问题

linux比较两个文件的不同(6/21)

diff(patch):比较两个文件之间的区别(补丁)

如何对比两个相同数据库表的不同

Linux IPC之管道和FIFO

Linux 服务器之间如何进行文件目录共享