【问题标题】:Partitioned Running Total in a Text File文本文件中的分区运行总计
【发布时间】:2011-03-30 20:33:07
【问题描述】:

给定一个带有“名称”和“日期”两列的制表符分隔的文本文件:

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 中这样做:select row_number() over (partition by column 1, column 2 order by column 10) from table

但我需要一个替代方案 - 不一定是 awk,但我想到了 - 对于 SQL 未处理的文本文件。文本文件约为 50GB,每个文件约有 2 亿行。

我使用计数器来删除重复的行。我知道,鉴于上面的示例,这可以通过以下方式完成:

排序 myfile.txt | uniq -u

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

我是否应该添加一个参数以仅匹配

中的名称和日期列

排序 myfile.txt | uniq -u

命令?啊?还有什么?

【问题讨论】:

    标签: sql text awk


    【解决方案1】:

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

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

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

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

    【讨论】:

    • 谢谢!并非所有行都具有相同的格式。我可以将 ++a[$0] 切换为仅在前两列上匹配的内容吗? ++a[$1$2]?
    猜你喜欢
    • 2015-12-18
    • 2015-12-20
    • 1970-01-01
    • 2013-12-13
    • 2021-08-15
    • 2019-03-19
    • 2012-06-05
    • 2015-09-08
    • 2023-04-05
    相关资源
    最近更新 更多