【问题标题】:Awk counting occurrences strange behaviourawk 计数出现的奇怪行为
【发布时间】:2011-12-08 03:13:00
【问题描述】:

我需要统计大量文件的第二列元素的出现次数。我正在使用的脚本是这样的:

{
 el[$2]++
}
END {
    for (i in el) {
    print i, el[i] >> "rank.txt"
    }
 }

为了在大量文件上运行它,我以这种方式使用find | xargs

find . -name "*.txt" | xargs awk -f script.awk

问题是,如果我计算输出文件rank.txt(带有wc -l rank.txt)的行数,我得到的数字(例如7600)大于第二行的唯一元素数(例如 7300),我通过 :

获得
find . -name "*.txt" | xargs awk '{print $2}' | sort | uniq | wc -l

实际上给出一个:

awk '{print $1}' rank.txt | sort | uniq | wc -l

我获得了正确数量的元素(按照示例,我将获得 7300)。所以这意味着输出文件第一列的元素不是唯一的。但是,这不应该发生!

【问题讨论】:

    标签: bash unix awk unique xargs


    【解决方案1】:

    这可能是输入文件 (*.txt) 包含非唯一元素和 xargs 功能这一事实的结合。 请记住,当有大量文件时,xargs 会使用不同的参数集重复调用。这意味着在第一个示例中,如果文件数量较多,则某些文件不会在一次 awk 运行中处理,这会导致输出中的“唯一”元素数量较多。

    你可以试试这个:

    find . -name "*.txt" | xargs cat | awk -f script.awk
    

    【讨论】:

    • 哦,我真的不知道这个!现在我无法测试它,但我会告诉你它是否有效。感谢您的帮助!
    • @TomasT。很高兴知道 xargs 的“功能”。 “当有大量文件时......”你能定义“大量”吗?默认值是多少?我们怎样才能避免这种情况发生?通过 xargs --max-args=n ?或 --max-chars=n ?谢谢
    • @Kent,这受最大命令行大小的限制,所以基本上总会有一些限制。
    【解决方案2】:

    你可以通过使用找出 $1 中的非重复项在哪里

    find . -name "*.txt" | xargs awk '{print $2}' | sort | uniq -c | awk '$1 > 1 {print}'
    

    我现在没有办法对此进行测试,最后一个 awk 的目的是过滤 uniq -c 的输出以仅显示计数大于 1 的记录。

    我希望这会有所帮助。

    【讨论】:

    • 谢谢!这不是我所需要的,但我也在寻找类似的东西。
    猜你喜欢
    • 2018-05-23
    • 1970-01-01
    • 2014-07-29
    • 1970-01-01
    • 2013-07-25
    • 2019-07-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多