2016-01-22 47 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

相关问题