原始数据:
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]}'
但是,该脚本似乎不起作用,因为它删除了所有重复的条目。如果有人可以帮助我,我会很感激。
答案 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