开发者社区> 问答> 正文

shell 排序去重问题

用 shell 处理一个文本文件,内容如下:

fdf     284 
asd     112
adf     146
csb     513
dfg     576
asd     346
adf     263
csb     092
dfg     547
根据第一列去重,相同的保留第二列值最大的那个,结果数据应该是这样的:

fdf    284
asd    346
adf    263
csb    513
dfg    576

看了下 uniq 命令,好像不支持按字段去重。请问该如何去重呢?

展开
收起
a123456678 2016-06-20 11:10:47 2146 0
1 条回答
写回答
取消 提交回答
  • 方法一

    cat data.txt | sort -rnk2 | awk '{if (!keys[$1]) print $0; keys[$1] = 1;}'
    先按照第二列逆序排列,保证数字从大到小输出,然后再用 awk,只有第一列的字符串第一次出现才输出这个字符串,其他的丢弃,这样应该就可以解决问题了。但是这种方法可能会让 awk 占用很多的内存,文件过大的话有问题。

    方法二

    cat data.txt | sort -k1,1 | awk '{
        if (lastKey == $1) {
            if (lastValue < $2) {
                lastLine = $0;
                lastValue = int($2);
            }
        } else {
            if (lastLine) {
                print lastLine;
            }
    
            lastKey = $1;
            lastLine = $0;
            lastValue = int($2);
        }
    } END {
        if (lastLine) {
            print lastLine;
        }
    }'

    这个方案是按照第一列排序,然后用 awk 筛选结果,筛选的过程相当于一个加强版的 uniq。这个方案在内存使用方面好了很多,不过代码量略多,不是很简洁。

    2019-07-17 19:43:55
    赞同 展开评论 打赏
问答分类:
问答地址:
问答排行榜
最热
最新

相关电子书

更多
Shell 脚本速查手册 立即下载
低代码开发师(初级)实战教程 立即下载
阿里巴巴DevOps 最佳实践手册 立即下载