我正在尝试根据第二个字段的值删除重复项。应保留第二个字段的较低值,应删除具有重复的第一个字段和较高的第二个字段的任何行。
这是我原始数据的一个例子:
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,特别是关联数组。
欢迎任何帮助。提前致谢!
答案 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}"