【问题标题】:Percentage of matching lines across multiple files跨多个文件的匹配行百分比
【发布时间】:2018-02-22 16:52:06
【问题描述】:

我需要找到跨多个文件的共同行;超过 100 个文件,每个文件有数百万行。与此类似:Shell: Find Matching Lines Across Many Files

但是,我不仅想找到所有文件中的共享行,还想找到在除一个之外的所有文件、除两个之外的所有文件中找到的那些行,依此类推。我有兴趣使用百分比来做到这一点。例如,哪些条目出现在 90% 的文件中,80%、70% 等等。举个例子:

文件1

lineA
lineB
lineC

文件2

lineB
lineC
lineD

文件3

lineC
lineE
lineF

为了演示的假设输出:

<lineC> is found in 3 out of 3 files (100.00%)

<lineB> is found in 2 out of 3 files (66.67%)

<lineF> is found in 1 out of 3 files (33.33%)

有人知道怎么做吗?

非常感谢!

【问题讨论】:

  • 请显示具有预期输出的多个文件的一些示例文件内容。
  • 请阅读如何ask good questions
  • 感谢您的帮助,我编辑了我的问题。
  • 您所展示的内容不会满足您的要求。你提到了 100 万行文本。我想你不需要显示所有行的统计数据。此外,运行这种规模的输入,一个简单的算法应该非常慢。你也需要实用的算法吗?
  • 为什么要显示一系列行作为所需的输出,然后说“我想要一个表格”而不是简单地显示一个表格作为所需的输出?

标签: bash grep comm


【解决方案1】:

使用 GNU awk 处理其多维数组:

gawk '
    BEGIN {nfiles = ARGC-1}
    { lines[$0][FILENAME] = 1 }
    END {
        for (line in lines) {
            n = length(lines[line])
            printf "<%s> is found in %d of %d files (%.2f%%)\n", line, n, nfiles, 100*n/nfiles
        }
    }
' file{1,2,3}
<lineA> is found in 1 of 3 files (33.33%)
<lineB> is found in 2 of 3 files (66.67%)
<lineC> is found in 3 of 3 files (100.00%)
<lineD> is found in 1 of 3 files (33.33%)
<lineE> is found in 1 of 3 files (33.33%)
<lineF> is found in 1 of 3 files (33.33%)

输出顺序不定

【讨论】:

  • 谢谢,格伦!这很好用,而且速度足以满足我的需求。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-10-09
  • 2021-05-07
  • 1970-01-01
  • 2017-12-25
  • 1970-01-01
  • 1970-01-01
  • 2018-04-13
相关资源
最近更新 更多