1

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

{
 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(用 a wc -l rank.txt),我得到的数字(例如 7600)大于第二行的唯一元素数(例如 7300),我用A :

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

实际上给出一个:

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

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

4

2 回答 2

5

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

你可以试试这个:

find . -name "*.txt" | xargs cat | awk -f script.awk
于 2011-10-14T23:35:24.463 回答
0

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

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

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

我希望这有帮助。

于 2011-10-14T23:22:58.233 回答