我有很多(即 >> 2)文本文件。这些文件大多相似,但之间有一些细微的差异。我想找到这些文件中最常出现的行。例如,这是我正在寻找的信息类型(我只关心数据;绝不需要任何特定的格式):
$ cat file1
line1line1line1
line2line2line2
line3line3line3
$ cat file2
line1line1line1
line2line2line2
$ cat file3
line1line1line1
line3line3line3
$ cat file4
line4line4line4
$ my_awesome_script file{1,2,3,4}
count | line
------+----------------
3 | line1line1line1
2 | line2line2line2
2 | line3line3line3
1 | line4line4line4
有一些常见的工具可以完成类似的任务,但是它们有一些局限性:
comm
- 一次只能比较两个文件;丢弃两个文件中都没有出现的行grep -f
- 丢弃不匹配的行grep -c
- 计算匹配项,但输出每个文件的总计数并丢弃有关哪些输入模式匹配的信息
为了澄清起见,如果一行在一个文件中出现多次,我只将其视为一次匹配。我只关心这些行出现在多少个文件中,而不关心这些行总共出现了多少次。
答案1
像这样的事情应该做你想做的:
#! /bin/sh
for f in ./file*; do
sort -u "$f"
done | \
sort | \
uniq -c | \
sort -rn | \
head -40
其目的for
是确保每个文件的每一行仅计数一次。管道其余部分的重点是计算出现次数。