免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 22414 | 回复: 12
打印 上一主题 下一主题

[文本处理] 如何删除一个数组中重复的元素? [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2013-07-12 20:10 |只看该作者 |倒序浏览
本帖最后由 zhaojys 于 2013-07-12 20:24 编辑

一个数组array,有重复的元素,举例:
array=(aa bb cc aa bb dd cc ee ff)

过滤重复的元素后,应该是:
array=(aa bb cc dd ee ff)

请问如何实现?
谢谢!!

论坛徽章:
2
射手座
日期:2014-10-10 15:59:4715-16赛季CBA联赛之上海
日期:2016-03-03 10:27:14
2 [报告]
发表于 2013-07-12 20:35 |只看该作者
回复 1# zhaojys


    array=($(awk -vRS=' ' '!a[$1]++' <<< ${array[@]}))

论坛徽章:
0
3 [报告]
发表于 2013-07-12 20:42 |只看该作者
只用shell脚本实现,不用外部工具实现,有什么办法么?

论坛徽章:
0
4 [报告]
发表于 2013-07-12 21:19 |只看该作者
本帖最后由 JeremyTOJ 于 2013-07-12 21:19 编辑
  1. #! /bin/bash
  2. array=(aa bb cc aa bb dd cc ee ff)
  3. len=${#array[@]}


  4. for((i=0;i<$len;i++))
  5. do


  6. for((j=$len-1;j>i;j--))
  7. do
  8. if [[ ${array[i]} = ${array[j]} ]]; then
  9. unset array[i]
  10. fi

  11. done
  12. done

  13. for arr in ${array[@]}

  14. do
  15. echo $arr

  16. done
复制代码

论坛徽章:
3
2015年辞旧岁徽章
日期:2015-03-03 16:54:152015年迎新春徽章
日期:2015-03-04 09:51:162015年亚洲杯之阿曼
日期:2015-04-07 20:00:59
5 [报告]
发表于 2013-07-12 21:58 |只看该作者
提示: 作者被禁止或删除 内容自动屏蔽

论坛徽章:
0
6 [报告]
发表于 2013-07-12 22:11 |只看该作者
本帖最后由 zhaojys 于 2013-07-12 22:17 编辑

awk实现的,算法肯定不会差。
只不过,我们运行shell的环境比较特殊,尽量用内部工具,有些外部工具可能没有。


论坛徽章:
0
7 [报告]
发表于 2013-07-12 22:12 |只看该作者
谢谢,和我想的一样,就是用unset。
回复 4# JeremyTOJ


   

论坛徽章:
2
射手座
日期:2014-10-10 15:59:4715-16赛季CBA联赛之上海
日期:2016-03-03 10:27:14
8 [报告]
发表于 2013-07-12 22:19 |只看该作者
本帖最后由 yinyuemi 于 2013-07-12 22:35 编辑

回复 3# zhaojys

  1. uniq (){
  2.     unset arr;
  3.     for i in $*;
  4.     do
  5.        unset $i;
  6.     done;
  7.     m=0;
  8.     for i in $*;
  9.     do  
  10.        if [ -z $(eval echo \$i) ];
  11.        then
  12.           eval arr[$m]=$i;
  13.           ((m++));
  14.           eval `echo $i=1`;  
  15.       fi;
  16.     done;
  17.     echo ${arr[*]};
  18. }
  19. array=($(uniq ${array[*]}))
复制代码

论坛徽章:
6
摩羯座
日期:2013-08-24 10:43:10狮子座
日期:2013-08-25 10:27:06天秤座
日期:2013-09-11 20:28:44午马
日期:2014-09-28 16:06:0015-16赛季CBA联赛之八一
日期:2016-12-19 13:55:0515-16赛季CBA联赛之天津
日期:2016-12-20 14:01:23
9 [报告]
发表于 2013-07-12 22:41 |只看该作者
如过是在一个空目录里!
  1. $ array=(aa bb cc aa bb dd cc ee ff)
  2. $ len=${#array[@]}
  3. $ for((i=0;i<$len;i++)); do echo "" >`echo ${array[$i]}`; done
  4. $ echo *
  5. aa bb cc dd ee ff
复制代码

论坛徽章:
1
IT运维版块每日发帖之星
日期:2015-12-16 06:20:00
10 [报告]
发表于 2013-07-13 18:34 |只看该作者
我觉得可以用shell里的sort和uniq配合使用,把数组的值先取出来,然后用uniq去重,再重新赋值。因为你给你样本比较短,所以我这边没法测效率。代码是这个样的。
  1. #! /bin/bash
  2. array=(aa bb cc aa bb dd cc ee ff)
  3. len=${#array[@]}
  4. for((i=0;i<$len;i++)){
  5.     echo ${array[$i]} >> tmpfile
  6. }
  7. sort tmpfile | uniq > tmpfile2
  8. len=`cat tmpfile2 | wc -l`
  9. for((i=1;i<=$len;i++)){
  10.     array[$i-1]=`cat tmpfile2 | sed -n "$i p"`
  11. }
  12. for((i=0;i<$len;i++)){
  13.     echo ${array[$i]}
  14. }
  15. rm -f tmpfile*
复制代码
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP