2013-04-23 27 views
1

在Linux的問題:我有CSV文件data.csv具有以下字段和值擊CSV排序和獨特-ING

KEY,LEVEL,DATA 
2.456,2,aaa 
2.456,1,zzz 
0.867,2,bbb 
9.775,4,ddd 
0.867,1,ccc 
2.456,0,ttt 
... 

字段KEY是浮點值,而LEVEL是整數。我知道第一場可以有重複的價值,第二場也可以,但如果你把它們放在一起,你就有了一對獨特的情侶。

我想這樣做是根據列KEY,然後KEY下每個唯一值的文件進行排序,只保留有LEVEL下的較高值的行。 排序是沒有問題的:

$> sort -t, -k1,2 data.csv # fields: KEY,LEVEL,DATA 
0.867,1,ccc 
0.867,2,bbb 
2.456,0,ttt 
2.456,1,zzz 
2.456,2,aaa 
9.775,4,ddd 
... 

但我怎麼可以過濾行,使我得到了我想要的東西,那就是:

0.867,2,bbb 
2.456,2,aaa 
9.775,4,ddd 
... 

有沒有辦法使用命令行來做到這一點像sort,uniq,awk等工具?在此先感謝

回答

4

嘗試這一行:

your sort...|awk -F, 'k&&k!=$1{print p}{p=$0;k=$1}END{print p}' 

輸出:

kent$ echo "0.867,1,bbb 
0.867,2,ccc 
2.456,0,ttt 
2.456,1,zzz 
2.456,2,aaa 
9.775,4,ddd"|awk -F, 'k&&k!=$1{print p}{p=$0;k=$1}END{print p}' 
0.867,2,ccc 
2.456,2,aaa 
9.775,4,ddd 

的想法,因爲你的文件已經排序,剛剛經歷從頂層文件/輸入,如果第一列(KEY)變了,打印最後一行,這是最後一行的值LEVEL最後的KEY

試着用你的真實數據,它應該工作。

也可以通過awk在單個進程中完成整個邏輯(與你的排序)。

+0

確定這個得很完美 - 並感謝您的解釋(這樣下次我還記得怎麼辦) , 謝謝! – csparpa 2013-04-23 14:13:17

0

Perl的解決方案:

perl -aF, -ne '$h{$F[0]} = [@F[1,2]] if $F[1] > $h{$F[0]}[0] 
       }{ 
       print join ",", $_, @{$h{$_}} for sort {$a<=>$b} keys %h' data.csv 

注意,結果是你要求的不同,第一行包含bbb,不ccc

+0

謝謝,這是一個錯字 – csparpa 2013-04-23 14:10:13

3

用途:

$> sort -r data.csv | uniq -w 5 | sort 

給你的浮標格式化「0.000」 - 「9.999」