2016-01-22 48 views
1

我有一個巨大的表,包含數十萬行和10列。我想根據第4列(ID)刪除這些重複項,但同時留下第9列(分數)中具有最高值的那個。刪除重複項,但將一個根據排序在不同的列中

我試着在AWK這個簡單的代碼,但它顯然更去除線比它應該和甚至沒有采摘的所有副本..

sort -rnk 9 myfile.txt | awk -F"[. ]" '!a[$4]++' >filtered.txt 

我會很感激任何意見;我很想在python或perl上使用這個工具,但我並不擅長(尚)。

感謝

+0

請顯示一些示例行。我很好奇你的字段分隔符 –

+0

我無法複製表格。但它的製表符分隔。 – Ale

+0

好吧,如果它是製表符分隔的,你的字段分隔符是錯誤的。嘗試'awk的-F 「\ t」 的'和'排序-t $'\ t''(AWK理解2字符串' 「\」, 「T」'是指一個標籤,但排序不 - 你需要給文字標籤排序的-t) –

回答

2

您的代碼看起來不錯,它肯定是一個聰明的辦法做到這一點。我會寫

awk -F"\t" ' 
    !($4 in max) || $9 > max[$4] {max[$4] = $9; line[$4] = $0} 
    END {for (key in line) print line[key]} 
' myfile.txt 

該方法應該很容易翻譯成另一種語言。

+0

感謝的人。修正「\ t」問題後,兩個代碼都給出了相同的結果! – Ale

+0

我很好奇哪一個更快。你可以計時嗎? –

+0

您的代碼更快肯定 – Ale

1

由於輸入文件是如此之大,這將是有意義的避免要求awk來存儲超過必要的信息,所以假設排序是不是過於緩慢,您不妨考慮排序/ awk程序的以下最優化變異體,至少提供的ID不是空字符串:

sort -t $'\t' -k4,4 -rnk 9,9 | awk -F\\t 'key!=$4 {key=$4; print}' 
+0

感謝,它也可以和其他 – Ale

相關問題