说,我有两个文件,想知道他们有多少相等的行.例如,file1是
1
3
2
4
5
0
10
Run Code Online (Sandbox Code Playgroud)
和file2包含
3
10
5
64
15
Run Code Online (Sandbox Code Playgroud)
在这种情况下,答案应为3(公共线为'3','10'和'5').
当然,这可以通过python完成,例如,但我很好奇从bash(使用一些标准工具或awk等其他东西).这就是我想出的:
cat file1 file2 | sort | uniq -c | awk '{if ($1 > 1) {$1=""; print $0}}' | wc -l
Run Code Online (Sandbox Code Playgroud)
这对任务来说似乎太复杂了,所以我想知道是否有更简单或更优雅的方法来实现相同的结果.
PS将公共部分的百分比输出到每个文件中的行数也很不错,但不是必需的.
UPD:文件没有重复的行
Ase*_*rre 11
要使用awk查找与2个文件共同的行:
awk 'a[$0]++' file1 file2
Run Code Online (Sandbox Code Playgroud)
会输出 3 10 15
现在,只需将其管道wc
以获取公共线的数量:
awk 'a[$0]++' file1 file2 | wc -l
Run Code Online (Sandbox Code Playgroud)
会输出3
.
说明:
这里的a
工作方式类似于默认值为0的字典.编写时a[$0]++
,将添加1 a[$0]
,但此指令返回之前的值a[$0]
(参见++和++之间的差异).所以你第一次遇到某个字符串时会有0(= false),下次会遇到1(或更多,仍然=真).
默认情况下,awk 'condition' file
是输出所有行为condition
true 的语法.
还要注意,a[]
每次遇到新密钥时,阵列都会展开.在脚本结束时,数组的大小将是您在所有输入文件中拥有的唯一值的数量(在OP的示例中,它将是9).
注意:此解决方案会计算重复项,即如果您有:
file1 | file2
1 | 3
2 | 3
3 | 3
Run Code Online (Sandbox Code Playgroud)
awk 'a[$0]++' file1 file2
将输出3 3 3
和awk 'a[$0]++' file1 file2 | wc -l
将输出3