2017-05-02 40 views
-3

製表符分隔的文件,我有一個非常大的製表符分隔的文件,其中有一部分是這樣的:排序和uniquize爲兩列

33 x 171 297 126 
4 x 171 300 129 
2 x 171 303 132 
11 y 163 289 126 
5 y 163 290 127 
3 y 163 291 128 
2 y 163 292 129 
2 y 170 289 119 
2 z 166 307 141 
2 z 166 308 142 
6 z 166 309 143 
4 z 166 329 163 
2 z 166 330 164 

我要排序,並僅選擇每行一個:X ,Y,Z基於與它在第一列(在UNIX中)

+4

那你試試? – kabanus

+0

所以你會期望'33 x ...','11 y ...'和'6 z ....'? –

+0

試試這個:'perl -lanE'($ v,$ k)= @ F [0..1]; $ h {$ k} = $ _,$ j {$ k} = $ v if $ j {$ k} <$ v; END(例如對於值%h)'文件' –

回答

1

你可以用awk做到這一點相關聯的最高值:

awk ' 
{ 
    key = $2; 
    flag = 0; 
    if (key in value) { max = value[key] ; flag = 1 }; 
    if (flag == 0 || max < $1) { value[key] = $1; line[key] = $0 }; 
} 
END { 
    for (key in line) { print line[key] }; 
} 
' data.tsv 
+0

你不需要國旗和最大。刪除第一個塊中的第2行和第3行,並將第4行中的if更改爲'if(value [key] <$ 1)'。 – ULick

+0

@ULick如果第一列包含負數,您的版本可能無法正常工作(默認值爲0和「」)。 – Andrey

+0

是的。可以通過if(!(key in value)|| $ 1> value [key])來解決。仍然沒有標誌,但失去了可讀性。 – ULick