【问题标题】:Multiple column sort多列排序
【发布时间】:2011-09-14 13:45:02
【问题描述】:

我有一些数据格式如下:

1298501934.311 42.048
1298501934.311 60.096
1298501934.311 64.128
1298501934.311 64.839
1298501944.203 28.352
1298501966.283 6.144
1298501972.900 0
1298501972.939 0
1298501972.943 0
1298501972.960 0
1298501972.961 0
1298501972.964 0
1298501973.964 28.636
1298501974.215 27.52
1298501974.407 25.984
1298501974.527 27.072
1298501974.527 31.168
1298501974.591 30.144
1298501974.591 31.296
1298501974.83 27.605
1298501975.804 28.096
1298501976.271 23.879
1298501978.488 25.472
1298501978.744 25.088
1298501978.808 25.088
1298501978.936 26.24
1298501979.123 26.048
1298501980.470 23.75
1298501980.86 17.53
1298501982.392 22.336
1298501990.199 8.064
1298501997.943 0.256
1298501997.943 0.448
1298501997.943 0.512
1298501997.943 5.952
1298501997.946 0.448
1298501997.946 0.576
1298501997.946 5.44

我的目标是从右列中获取左列中每个唯一值的最大值。例如,在处理完以下 4 行之后:

1298501997.943 0.256
1298501997.943 0.448
1298501997.943 0.512
1298501997.943 5.952

我只想得到最后一行,

1298501997.943 5.952

因为“5.952”是1298501997.943 的最大值

同样,对于以下几行:

1298501997.946 0.448
1298501997.946 0.576
1298501997.946 5.44

我想得到:

1298501997.946 5.44

对于:

1298501990.199 8.064

简单地说:

1298501990.199 8.064

等等……

我尝试在 awk/uniq/etc. 中搜索一些提示,但甚至不确定如何制定查询。 我可以编写一个 Python 脚本,但感觉继续使用 awk 或其他一些标准工具会更有效(尤其是因为我有大量数据 - 数百万/数千万行)。

PS:是否有任何 Python 模块用于类似的文本处理场景?

谢谢

【问题讨论】:

  • 你在哪里有这些数据?只是在文本文件中?在数据库中?以及您想用什么对其进行排序?一种特定的编程语言,还是您只想对数据(无论它在哪里)进行排序?

标签: sorting unique


【解决方案1】:

你可以把它放在 Excel 中(通过分割空格字符来导入它)并以这种方式排序。这是一个相当暴力的解决方案,但它很简单。

【讨论】:

    【解决方案2】:

    使用 awk:

    {
        if (array[$1] < $2)
            array[$1]=$2
    }
    END {
        printf("%-20s%s\n", "Value", "Max")
        printf("%-20s%s\n", "-----", "---")
        for (i in array)
            printf("%-20s%s\n", i, array[i])
    }
    

    输出:

    $ awk -f sort.awk log 
    Value               Max
    -----               ---
    1298501980.86       17.53
    1298501978.808      25.088
    1298501974.215      27.52
    1298501973.964      28.636
    1298501979.123      26.048
    1298501978.936      26.24
    1298501975.804      28.096
    1298501972.964      
    1298501944.203      28.352
    1298501974.83       27.605
    1298501974.407      25.984
    1298501997.943      5.952    <---- as in your example
    1298501978.488      25.472
    1298501972.939      
    1298501972.900      
    1298501982.392      22.336
    1298501974.527      31.168
    1298501997.946      5.44     <---- as in your example
    1298501980.470      23.75
    1298501974.591      31.296
    1298501990.199      8.064    <---- as in your example
    1298501966.283      6.144
    1298501934.311      64.839
    1298501976.271      23.879
    1298501972.960      
    1298501978.744      25.088
    1298501972.961      
    1298501972.943      
    

    【讨论】:

    • 非常感谢您的帮助!
    【解决方案3】:

    一个简单的sort -g 就可以了。是一般的数字排序,可以处理空格。

    【讨论】:

    • 这不会做 OP 想要的:为右列中的每个唯一值找到左列的最大值。
    【解决方案4】:

    我怀疑 python 在这里的效率会明显低于其他工具(除非您需要每分每秒处理数百万个数据)。你可以这样做:

    import sys
    d={}
    for l in open(sys.argv[1]):
        a,b=[float(item) for item in l.split()]
        d[a]=max(d.get(a,b),b)
     for a in d: print a,d[a]
    

    并运行它

    $ python script.py dataFile
    

    【讨论】:

      【解决方案5】:

      作为 shell 单线(使用 uniq-f 参数,忽略 第一个 n 列;忽略第二个,列交换两次)

      cat yourData | sort -g | awk '{print $2,$1};'  | uniq -f1 | awk '{print $2,$1};'
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2014-04-11
        • 2014-05-20
        • 2018-04-29
        • 2011-01-04
        相关资源
        最近更新 更多