附加到行的特定字段的频率计数,不删除重复项

时间:2014-08-17 07:58:21

标签: sorting frequency uniq

尝试找出如何在文件中的每一行附加或附加频率,而不删除重复的事件(uniq可以为我做什么)。

所以,如果输入文件是:

mango
mango
banana
apple
watermelon
banana

我需要输出:

mango 2
mango 2
banana 2
apple 1
watermelon 1
banana 2

我见过的所有解决方案都删除了重复项。换句话说,我不想要的是:

mango 2
banana 2
apple 1
watermelon 1

1 个答案:

答案 0 :(得分:0)

基本上,如果不将所有内容保存在内存中,就无法一次完成。如果这是你想要做的,那么使用python / perl / awk / whatever。算法非常简单。

让我们用标准的Unix工具来做。这有点麻烦,可以改进,但应该做的工作:

$ sort input | uniq -c > input.count
$ nl input | sort -k 2  > input.line
$ join -1 2 -2 2 input.line input.count | sort -k 2 | awk '{print $1 " " $3}

第一步是计算给定单词的出现次数。

正如你所说,你不能重复并保持排序。所以我们必须解决这个问题。第二步预先设置我们稍后将用于修复订购问题的行号。

在最后一步中,我们将原始单词上的两个临时文件连接起来,第二列包含我们对此键进行排序的原始行号排序,并将其从最终输出中删除。