我需要计算大量文件第二列元素的出现次数。我正在使用的脚本是:
{
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)。因此,这意味着输出文件第一列的元素不是唯一的。但是,这不应该发生!你们有人有任何线索吗?
感谢您的帮助。
答案 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
的输出,只显示计数大于一的记录。
我希望这会有所帮助。