0

我需要一些有关文本操作的帮助。
我确实有这样的数据:

29554 31109 "ENSG00000243485.1" 1555
29554 31097 "ENSG00000243485.1" 1543
29554 30039 "ENSG00000243485.1" 485
30564 30667 "ENSG00000243485.1" 103
30267 30667 "ENSG00000243485.1" 400
30976 31109 "ENSG00000243485.1" 133
89295 133566 "ENSG00000238009.2" 44271
89295 120932 "ENSG00000238009.2" 31637
120775 120932 "ENSG00000238009.2" 157
112700 112804 "ENSG00000238009.2" 104
92091 92240 "ENSG00000238009.2" 149
28269867 28269929 "ENSG00000248451.1" 62
28270383 28270486 "ENSG00000248451 .1"103
28273195 28273372 "ENSG00000248451.1" 177
28275308 28275354 "ENSG00000248451.1" 46
.....................

我必须打印每组价值最大的行。
第 4 列中有组名,第 5 列中有值。
我想它应该是这样的:
1. 将组彼此分开;
2.选择最大的值;
3.打印整行。

该示例的首选输出应该是:

29554 31109 “ENSG00000243485.1” 1555
89295 133566 “ENSG00000238009.2” 44271
28273195 28273372 “ENSG00000248451.1” 177

希望有人可以在 awk 或 sed 中帮助我。

4

3 回答 3

2

您只需要使用 awk 传递一次文件:

awk '
    $4 > val[$3] {val[$3] = $4; line[$3] = $0} 
    END {for (grp in line) print line[grp]}
' filename
于 2012-09-18T20:43:58.457 回答
1

这应该在bashand中执行awk

GROUPS=$(cut -d' ' -f3 datafile | uniq) # list of groups
for f in "$GROUPS"
do 
  # print line if 4th field is max
  awk -v "grp=$f" '$0 ~ grp && $4 > max {max=$4; line=$0} END {print line}' datafile
done
于 2012-09-18T16:54:59.507 回答
1

This might work for you:

cat -n file | sort -k4,4 -k5,5nr | sort -u -k4,4 | sort -n | cut -f2-
于 2012-09-18T20:08:37.380 回答