一行命令实现 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[@]}
echo ${#c[@]}
下面解释一下命令的处理原理:
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 第四步得到的只是一个空格分隔的字符串,如果需要的是一个数组,则需要在外面扩个括号,就成功得到了一个去重后的数组.
补充:前面的数组比较短,可能体现不出和循环处理方式的区别,这里补一个比较大的数组,差异就看出来了:
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[@]}
echo ${#c[@]}
|