按特定值选择具有重复列的行

时间:2013-06-25 17:42:37

标签: regex perl sed awk pattern-matching

我有这样的输入:

LineA parameter1 parameter2 56  
LineB parameter1 parameter2 87
LineB parameter1 parameter2 56
LineB parameter1 parameter2 90
LineC parameter1 parameter2 40  

我想打印每一行,但是,如果第一列($1)重复,则只打印最后一列($4)中具有最高值的行。

所以输出应该如下所示:

LineA parameter1 parameter2 56
LineB parameter1 parameter2 90
LineC ...

3 个答案:

答案 0 :(得分:2)

尝试以下(假设字段4始终> = 0)

数组b用于跟踪字段4中字段1中唯一值的最高值。数组a(由字段1键控)包含相应的记录。处理每条记录时,记录将添加到数组a,字段4将添加到数组b,如果  1.第一次在字段1中遇到一个值,或者2.字段4中的值超过字段1中值b中的现有值。 最后,打印出数组a

 awk '$4 > b[$1] {a[$1] = $0; b[$1] = $4}
 END{for (x in a) {print a[x]}}'

答案 1 :(得分:2)

GNU代码

awk 'BEGIN {SUBSEP=OFS} $4>a[$1,$2,$3] {a[$1,$2,$3]=$4} END {for (i in a) {print i,a[i]}}' file

答案 2 :(得分:0)

awk中的另一种方式:

awk '
fld1!=$1 && NR>1 {print line}
fld1==$1 {line=(fld4>$4)?line:$0;next}
{line=$0;fld1=$1;fld4=$4;next}
END{print line}' file