在文本文件中分区运行总计

时间:2010-08-17 08:16:19

标签: sql text awk

给定带有两列“name”和“date”的带标签的分隔文本文件:

Sam     20100101
Sam     20100101
Sam     20100102
George  20100101
George  20100101
George  20100102

我可以使用awk添加具有分区运行总计的第三列,例如为第一列的每个不同模式启动一个计数器为0,然后为该模式的任何重复递增第二列?

Sam     20100101     1
Sam     20100101     2
Sam     20100102     1
George  20100101     1
George  20100101     2
George  20100102     1

我在SQL中执行此操作:从表中选择row_number()(第1列的分区,第10列的第2列)

但我需要一个替代方案 - 不一定是awk,但想到这一点 - 对于未由SQL处理的文本文件。文本文件大约为50GB,大约200密耳行。

我使用计数器删除重复的行。我知道,根据上面的例子,可以通过以下方式完成:

sort myfile.txt | uniq -u

但是我的文本文件还有我的示例中未包含的其他列(为简洁起见),这些列可能不会产生完全重复的行。

我应该添加一个参数来匹配

中的名称和日期列

sort myfile.txt | uniq -u

命令? AWK?还有别的吗?

1 个答案:

答案 0 :(得分:3)

如果所有行都具有相同的格式(包括空格),那么简单的方法就可以解决问题:

awk '{print $0, ++a[$0]}'

我不确定GB大小文件的性能,因为这需要为每个唯一行存储一个数字。如果您的数据已经过排序,您可以获得固定数量的存储空间:

awk '{ if ($0 != prev) n = 0; print $0, ++n; prev = $0 }'