2011-09-14 52 views
1

我有以下格式的一些數據:多列排序

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的/等一些提示。但不知道如何制定查詢。 我可以編寫一個Python腳本,但是覺得繼續使用awk或其他標準工具會更有效率(尤其是因爲我有大量數據 - 數百萬/數千萬行)。

PS:有沒有用於這種文本處理場景的任何Python模塊?

謝謝

+2

你有哪些數據?只是在一個文本文件?在數據庫中?你想用什麼來分類?一種特定的編程語言,還是隻是希望將數據(無論它在哪裏)進行排序? – cdeszaq

回答

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  
+0

非常感謝您的幫助! – Nik

2

你可以把它在Excel中(通過拆分對空格字符輸入的話),並對其進行排序的方式。這是一個相當蠻力的解決方案,但很簡單。

0

一個簡單的sort -g會伎倆。這是一般的數字排序,可以處理空間。

+0

這不會做OP想要的:找到右列中每個唯一值的最左列。 – eudoxos

0

我懷疑蟒蛇會顯著效率較低,這裏比其他工具(除非你需要處理數以百萬計的數據的第二每分)。你可以做這樣的事情:

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 
0

作爲一個殼狀的襯墊運行它(使用-f說法uniq,而忽略第一 n列;忽略第二,列被交換兩次)

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