Awk计数出现奇怪的行为

时间:2011-10-14 22:57:36

标签: bash unix awk unique xargs

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

{
 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)。因此,这意味着输出文件第一列的元素不是唯一的。但是,这不应该发生!你们有人有任何线索吗?

感谢您的帮助。

2 个答案:

答案 0 :(得分:5)

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

你可以试试这个:

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

答案 1 :(得分:0)

你可以通过

找出$ 1中非重复的位置
find . -name "*.txt" | xargs awk '{print $2}' | sort | uniq -c | awk '$1 > 1 {print}'

我现在没办法测试这个,最后一个awk的意图是过滤uniq -c的输出,只显示计数大于一的记录。

我希望这会有所帮助。