用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。这个方案在内存使用方面好了很多,不过代码量略多,不是很简洁。
慕慕森
TA贡献1856条经验 获得超17个赞
$sort-ra.txt|awk'{print$2,$1}'|uniq-f1|awk'{print$2,$1}'fdf284dfg576csb513asd346adf263逆排,反转第一列和第二列,按第二列去重,反转第一列和第二列
添加回答
举报
0/150
提交
取消