制作字典......有点儿

时间:2011-08-05 11:09:24

标签: bash shell

我在制表符分隔文件中有以下一组值(此处仅显示部分值...文件有2列)

MXRA8   9.9074e-08
AURKAIP1    0.0000e+00
CCNL2   1.4962e-07
CCNL2   2.0536e-07
CCNL2   2.5198e-07
CCNL2   2.5311e-07
LOC148413   2.2558e-07
MRPL20  0.0000e+00
LOC441869   0.0000e+00
TMEM88B 0.0000e+00 

由于CCNL2的明显值出现4次,我想要的是只应提取第一列中重复名称的最高值并将其放入另一个文件中。

像这样的东西

MXRA8   9.9074e-08 
AURKAIP1    0.0000e+00 
CCNL2   2.5311e-07 
LOC148413   2.2558e-07 
MRPL20  0.0000e+00 
LOC441869   0.0000e+00 
TMEM88B 0.0000e+00 

有关bash Shell脚本脚本的任何建议。

或PERL中的一个班轮

3 个答案:

答案 0 :(得分:3)

通过排序man-page判断,它使用numeric-sort处理浮点值,但是你可能想把它放到测试中:

sort --key=2 --general-numeric-sort --reverse input.txt | sort --key=1,1 --unique

AURKAIP1    0.0000e+00
CCNL2   2.5311e-07
LOC148413   2.2558e-07
LOC441869   0.0000e+00
MRPL20  0.0000e+00
MXRA8   9.9074e-08
TMEM88B 0.0000e+00

答案 1 :(得分:2)

尝试:

awk -F '\t' 'BEGIN { } { if (max[$1] == "" || $2 > max[$1]){ max[$1] = $2 } } END { for (var in max) { print var,"\t",max[var] } } ' tab-limited-data-file

这应该打印出第一列中每个值的最大值。

答案 2 :(得分:1)

您可以先排序,然后使用awk逐行读取文件,只保留最大行。如果重复的行始终按照样本输入进行分组,则可以避免排序。

sort file | awk -F '\t' 'NR==1{last = $1; max = 0} {if (last != $1) {printf "%s\t%e\n", last, max; last = $1; max = $2} else if (max < $2) max = $2} END{printf "%s\t%e\n", last, max}'