在awk的单个字段中根据非数字条件删除重复行

时间:2015-03-09 23:22:48

标签: linux bash awk

原始数据:

    1234,yes
    2234,no
    1234,no
    5678,yes

我试图根据第二列删除重复项(是||否),其中只删除带有“否”的列。我看到很多处理整数的解决方案,但不是字符串。到目前为止,我想出了这个。

awk -F"," '{if($1 in a)
               a[$1]=$2=='yes'?$0:a[$1];
            else
               a[$1]=$0}
           END{for(i in a)print a[i]}'

但是,该脚本似乎不起作用,因为它删除了所有重复的条目。如果有人可以帮助我,我会很感激。

2 个答案:

答案 0 :(得分:2)


你的问题非常简单:你忘了引用你的条件:

awk -F"," '{if($1 in a)a[$1]=$2=="yes"?$0:a[$1];else a[$1]=$0}END{for(i in a)print a[i]}'

你必须写 $ 2 ==“是”而不是 $ 2 =='是'

修改
为了不在最终结果中显示“,否”,您可以尝试这种变化(更难以适应您对先前模式的需求):

 awk -F"," '{if($1 in a){if($2=="yes"){a[$1]=$0;}}else{sub(/,no$/,"",$0);a[$1]=$0}}END{for(i in a)print a[i]}'


有关 sub(...)功能的更多信息,您可以转到there

很高兴为您提供帮助:)

答案 1 :(得分:1)

[如果我理解你正在尝试做什么...]

当第一列的值已出现在先前的"no"行或之前的"yes"行中时,此单行仅删除"no"行。

awk -F"," '{if (!($2=="no" && $1 in a)) {print $0;} a[$1]=$0 }' file.txt