Sorting 多列排序

Sorting 多列排序,sorting,unique,Sorting,Unique,我有以下格式的一些数据: 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 1298

我有以下格式的一些数据:

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模块可用于类似的文本处理场景吗


谢谢

您可以将其放入Excel(通过拆分空格字符导入)并按此方式排序。这是一个相当暴力的解决方案,但它很简单。

一个简单的
排序-g
就可以解决这个问题。它是通用数字排序,可以处理空格。

使用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])
}
{
如果(数组[$1]<$2)
数组[$1]=$2
}
结束{
printf(“%-20s%s\n”、“值”、“最大值”)
printf(“%-20s%s\n”、“----”、“----”)
for(数组中的i)
printf(“%-20s%s\n”,i,数组[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      
$awk-f sort.awk日志
最大值
-----               ---
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我怀疑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
作为shell一行程序(使用
uniq
-f
参数,忽略前n列;要忽略第二列,将交换两次列)


你在哪里有这些数据?只是在一个文本文件中?在数据库中?你想用什么来分类呢?一种特定的编程语言,或者您只是想对数据(无论它在哪里)进行排序?这并不能满足OP的要求:为右列中的每个唯一值查找左列的最大值。非常感谢您的帮助!
cat yourData | sort -g | awk '{print $2,$1};'  | uniq -f1 | awk '{print $2,$1};'