一行命令实现 linux数组去重(原创)

一行命令实现 linux数组去重

网上关于数组的排序和去重大多都是写循环,如果数组很大,要耗费很多时间,这里借助linux本身的流处理命令,大大提高了运算的速度,也减少了代码的行数。

#--指定一个数组
b=(0 2 3 4 5 2 3 4 5 6 1 0)
#--数组去重
c=(`echo ${b[@]}|sed -e 's/ /\n/g'|sort -nu|sed -e ':a;N;s/\n/ /g;ta'`)
#--打印输出,检验结果
echo ${c[@]} #0 1 2 3 4 5 6
echo ${#c[@]} #7

下面解释一下命令的处理原理:

1 echo 打印数组;

2 sed命令将打印的数组中空格分隔符替换为\n换行符,这一步是为了方便sort命令进行排序和去重,因为sort命令一般用用于文件去重,需要以行为单位;

3 sort 命令先排序再去重,-n按照数字类型排序,-u取代了uniq的功能,直接去除重复行;

4 sed命令将\n再变回空格分隔符号
----关于这个命令要详细解释一下::a 和ta 是一对符号,:a是先做一个标记,然后如果ta之前执行成功,则跳转到:a标识符继续执行,达到了循环的效果;
----N则是把后一行合并到当前行,因为\n分隔的字符串在sed中是一行一行处理的,没法直接将每一行末尾的\n替换(即\n被当作的行的分隔符),所以要先合并下一行,然后替换其中的\n为空格;

5 第四步得到的只是一个空格分隔的字符串,如果需要的是一个数组,则需要在外面扩个括号,就成功得到了一个去重后的数组.

补充:前面的数组比较短,可能体现不出和循环处理方式的区别,这里补一个比较大的数组,差异就看出来了:

#--指定一个20万个元素组成的数组
b=(`seq 1 100000` `seq 100000 1`)
#--数组去重(仅仅需要几秒钟,如果是写嵌套循环比较,不知道要多久了)
c=(`echo ${b[@]}|sed -e 's/ /\n/g'|sort -nu|sed -e ':a;N;s/\n/ /g;ta'`)
#--打印输出,检验结果
echo ${c[@]} #1-100000
echo ${#c[@]} #100001

  • 3
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值