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

标签 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,特别是关联数组。

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

最佳答案

您可以使用这个 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

关于linux - AWK 根据两个条件删除重复行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32124270/

相关文章:

linux - Bash:日期 "%b"和日期 "%h"(当然还有)日期 "%B"给出月份的全名?

mysql - Bash-MySQL/尝试向表中插入字符串

regex - 用于从文本中解析名称和电子邮件的正则表达式

linux - 最后如何获取长命令的输入

linux - 适用于 RHEL 5 的 OpenSSL-1.0.1e

linux - 有没有SSH的替代品

bash - 在 Bash 中重用上一个命令的输出

awk 按字段名排列记录顺序

regex - 在 awk 中使用非精确匹配合并两个文件

c++ - 在 C++ 中使用寄存器变量可以做多少坏事