为了账号安全,请及时绑定邮箱和手机立即绑定

shell 排序去重问题

shell 排序去重问题

慕勒3428872 2019-04-13 08:46:05
用shell处理一个文本文件,内容如下:fdf284asd112adf146csb513dfg576asd346adf263csb092dfg547根据第一列去重,相同的保留第二列值最大的那个,结果数据应该是这样的:fdf284asd346adf263csb513dfg576看了下uniq命令,好像不支持按字段去重。请问该如何去重呢?
查看完整描述

2 回答

?
DIEA

TA贡献1820条经验 获得超2个赞

方法一
catdata.txt|sort-rnk2|awk'{if(!keys[$1])print$0;keys[$1]=1;}'
先按照第二列逆序排列,保证数字从大到小输出,然后再用awk,只有第一列的字符串第一次出现才输出这个字符串,其他的丢弃,这样应该就可以解决问题了。但是这种方法可能会让awk占用很多的内存,文件过大的话有问题。
方法二
catdata.txt|sort-k1,1|awk'{
if(lastKey==$1){
if(lastValue<$2){
lastLine=$0;
lastValue=int($2);
}
}else{
if(lastLine){
printlastLine;
}
lastKey=$1;
lastLine=$0;
lastValue=int($2);
}
}END{
if(lastLine){
printlastLine;
}
}'
这个方案是按照第一列排序,然后用awk筛选结果,筛选的过程相当于一个加强版的uniq。这个方案在内存使用方面好了很多,不过代码量略多,不是很简洁。
                            
查看完整回答
反对 回复 2019-04-13
?
慕慕森

TA贡献1856条经验 获得超17个赞

$sort-ra.txt|awk'{print$2,$1}'|uniq-f1|awk'{print$2,$1}'
fdf284
dfg576
csb513
asd346
adf263
逆排,反转第一列和第二列,按第二列去重,反转第一列和第二列
                            
查看完整回答
反对 回复 2019-04-13
  • 2 回答
  • 0 关注
  • 535 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信