Chinaunix首页 | 论坛 | 博客
  • 博客访问: 186966
  • 博文数量: 28
  • 博客积分: 648
  • 博客等级: 上士
  • 技术积分: 260
  • 用 户 组: 普通用户
  • 注册时间: 2010-12-17 05:33
文章分类

全部博文(28)

文章存档

2012年(1)

2011年(27)

分类: LINUX

2011-04-08 04:35:48

原帖:
 
cat file
1 A
2 B
3 C
4 A
5 D
 
  1. #!/bin/bash
  2. s=$'\n'
  3. while read null str
  4. do
  5. [ "$s" == "${s/ $str}" ] && echo $str && s="$s $str"
  6. done

上面是原代码,我做了下修改,来展示整个程序执行的过程(为了更加明了,我将原来的s=$'\n',给为s="#"):

 

  1. #!/bin/bash
  2. s="#"
  3. while read null str
  4. do
  5. echo "s: " $s "|str: " $str "|null: " $null
  6. echo "if [ "$s" == " ${s/ $str} "]"
  7. if [ "$s" == "${s/ $str}" ]
  8. then
  9. echo "str: " $str "||" ${s/ str} && s="$s $str"
  10. else
  11. echo "s: " $s "|str: " $str "|null: " $null
  12. fi
  13. done

脚本执行结果:

 

  1. s: # |str: A |null: 1
  2. if [ # == # ]
  3. str: A || #
  4. s: # A |str: B |null: 2
  5. if [ # A == # A ]
  6. str: B || # A
  7. s: # A B |str: C |null: 3
  8. if [ # A B == # A B ]
  9. str: C || # A B
  10. s: # A B C |str: A |null: 4
  11. if [ # A B C == # B C ]
  12. s: # A B C |str: A |null: 4
  13. s: # A B C |str: D |null: 5
  14. if [ # A B C == # A B C ]
  15. str: D || # A B C

原来问题的关键就是"$s" == " ${s/ $str},这个判断。

${s/ $str}实际上是bash对字符串处理的一种方式,替换,即${var/a/b/} 将var中的a替换成b,当b为空时,可以直接写成${var/a}的形式。

利用这个bash处理字符串的功能,就可以实现去重复,很巧妙的设计!

 

阅读(3151) | 评论(1) | 转发(1) |
0

上一篇:vi删除

下一篇:awk初学之常见问题

给主人留下些什么吧!~~

longber2011-07-26 23:10:47

还是用awk+sort方便些,而且可能执行速度上也要强些