我有以下格式的数据:
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模块?
谢谢
答案 0 :(得分:2)
您可以将它放在Excel中(通过拆分SPACE字符导入它)并按这种方式对其进行排序。这是一个相当强力的解决方案,但它很简单。
答案 1 :(得分:1)
使用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
答案 2 :(得分:0)
一个简单的sort -g
可以解决问题。它是通用数字排序,可以处理空间。
答案 3 :(得分:0)
我怀疑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
答案 4 :(得分:0)
作为shell一行(使用-f
uniq
参数,忽略第一个 n列;忽略第二列,列交换两次)
cat yourData | sort -g | awk '{print $2,$1};' | uniq -f1 | awk '{print $2,$1};'