选择最大值并打印该行

时间:2012-09-18 16:40:32

标签: sorting sed awk

我需要一些文字操作方面的帮助 我确实有这样的数据:

  

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帮助我。

2 个答案:

答案 0 :(得分:2)

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

awk '
    $4 > val[$3] {val[$3] = $4; line[$3] = $0} 
    END {for (grp in line) print line[grp]}
' filename

答案 1 :(得分:1)

这应该在bashawk

中进行
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