如何计算多个文件中行的频率?

如何计算多个文件中行的频率?

我有很多(即 >> 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是确保每个文件的每一行仅计数一次。管道其余部分的重点是计算出现次数。

相关内容