AWK根据两个条件删除重复行

时间:2015-08-20 17:09:01

标签: linux bash awk

我正在尝试根据第二个字段的值删除重复项。应保留第二个字段的较低值,应删除具有重复的第一个字段和较高的第二个字段的任何行。

这是我原始数据的一个例子:

1234     2     ABCD
3234     1     DEFG
1234     1     DEFG

这是应该如何:

1234     1   DEFG
3234     1   DEFG 

到目前为止,基于this post:我提出了这个脚本:

awk '{
    if($1 in a){
        if($2 < a[$1]){
            a[$1]= $2;
            r[$1]=$0;
        } else {
            a[$1]=$2;
            r[$1]=$0;
        }
    }
} end {for(x in r) print r[x]}'

但它没有结果返回。

我还在学习如何使用awk,特别是关联数组。

欢迎任何帮助。提前致谢!

3 个答案:

答案 0 :(得分:1)

你可以使用这个awk:

awk '!($1 in a) || $2 < a[$1] {a[$1]=$2; r[$1]=$0} END {for (i in r) print r[i]}' file
1234     1     DEFG
3234     1     DEFG

答案 1 :(得分:1)

通过预先分步,awk将更简单

sort -k 1,2 file | awk '!a[$1]{a[$1]=1;print}'

awk根据键$ 1选择重复项中的第一条记录。

答案 2 :(得分:0)

这是一个Bash解决方案,它不是那么漂亮,但它很直接,可以很容易地扩展到其他逻辑:

oldcol1="nv"
oldcol2=0
oldcol3="" 
while read -a arr; do 
if [[ "${arr[0]}" == "${oldcol1}" ]]; then 
 ((${arr[1]}<${oldcol2})) && oldcol2=${arr[1]}
else 
 [[ ! "${oldcol1}" == "nv" ]] && echo "${oldcol1} ${oldcol2} ${oldcol3}"
 oldcol1="${arr[0]}"
 oldcol2=${arr[1]}
 oldcol3="${arr[2]}"
fi  
done < <(sort -k1,1 f.txt) && echo "${oldcol1} ${oldcol2} ${oldcol3}"