gpt4 book ai didi

bash - 计算两个文件中的相等行

转载 作者:行者123 更新时间:2023-11-29 08:52:54 25 4
gpt4 key购买 nike

比如,我有两个文件,想知道它们有多少行。例如,file1

1
3
2
4
5
0
10

file2 包含

3
10
5
64
15

在这种情况下,答案应该是 3(常用行是“3”、“10”和“5”)。

当然,例如,使用 python 可以非常简单地完成此操作,但我对从 bash(使用一些标准实用程序或额外的东西,如 awk 或其他)来完成它感到好奇。这是我想出的:

 cat file1 file2 | sort | uniq -c | awk '{if ($1 > 1) {$1=""; print $0}}' | wc -l

对于这项任务来说,这似乎太复杂了,所以我想知道是否有更简单或更优雅的方法来实现相同的结果。

附言输出公共(public)部分占每个文件中行数的百分比也很好,但不是必需的。

更新:文件没有重复行

最佳答案

使用 awk 查找与您的 2 个文件相同的行:

awk 'a[$0]++' file1 file2

将输出3 10 15

现在,只需将其通过管道传递给 wc 即可获取公共(public)行数:

awk 'a[$0]++' file1 file2 | wc -l

将输出3

解释:

这里,a 就像一个默认值为 0 的字典。当您编写 a[$0]++ 时,您将向 a[ $0],但此指令返回 a[$0] 的先前值(参见 difference between a++ and ++a )。因此,您第一次遇到某个字符串时会得到 0(= false),下次遇到时会得到 1(或更多,仍然 = true)。

默认情况下,awk 'condition' file 是一种输出所有 condition 为真的行的语法。

另请注意,每次遇到新键时,a[] 数组都会扩展。在脚本的末尾,数组的大小将是您在所有输入文件中拥有的唯一值的数量(在 OP 的示例中,它将是 9)。


注意:此解决方案计算重复项,即如果您有:

file1 | file2
1 | 3
2 | 3
3 | 3

awk 'a[$0]++' file1 file2 将输出 3 3 3awk 'a[$0]++' file1 file2 | wc -l 将输出 3

如果这是您不希望的行为,您可以使用以下代码来过滤掉重复项:

awk '++a[$0] == 2' file1 file2 | wc -l

关于bash - 计算两个文件中的相等行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25283335/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com