免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
楼主: zooyo

[游戏娱乐] 2012年ChinaUnix社区Shell编程大赛 [结束评审 公布部分答案](获奖名单已公布-5-24) [复制链接]

论坛徽章:
0
发表于 2012-04-05 09:54 |显示全部楼层
  1. 二者有区别
  2. 一、FS不一样
  3. a.域分隔符不一样,如上演示。FS打印出分隔符
  4. omu0:~ # awk -F ' ' 'BEGIN{print "#"FS"#"}'
  5. # #

  6. omu0:~ #$ awk -F '[ ]' 'BEGIN{print "#"FS"#"}'
  7. #[ ]#

  8. omu0:~ # awk -F '[ ]+' 'BEGIN{print "#"FS"#"}'
  9. #[ ]+#


  10. b.匹配不一样。
  11. omu0:~ # cat data
  12. a|1:o*
  13. b|2:o*
  14. c|3:o*
  15. d|4:o*
  16. e*5:o*
  17. f|6:o*
  18. g:7:o*
  19. omu0:~ # awk -F '[:|*]' '{print $1}' data
  20. a
  21. b
  22. c
  23. d
  24. e
  25. f
  26. g
  27. omu0:~ # awk -F '[:|*]+' '{print $1}' data
  28. a
  29. b
  30. c
  31. d
  32. e
  33. f
  34. g
  35. omu0:~ # awk -F ' ' '{print $1}' data
  36. a|1:o*
  37. b|2:o*
  38. c|3:o*
  39. d|4:o*
  40. e*5:o*
  41. f|6:o*
  42. g:7:o*
  43. omu0:~ #


  44. 三、含义不一样
  45. -F ' '  #以任意个(>=1)连续的空格或tab为分隔符,等同于-F '[ \t]+'

  46. -F '[ ]' #以单个空格为分隔符

  47. -F '[ ]+' #以任意个(>=1)连续的空格为分隔符
复制代码

论坛徽章:
49
15-16赛季CBA联赛之福建
日期:2016-06-22 16:22:002015年亚洲杯之中国
日期:2015-01-23 16:25:12丑牛
日期:2015-01-20 09:39:23未羊
日期:2015-01-14 23:55:57巳蛇
日期:2015-01-06 18:21:36双鱼座
日期:2015-01-02 22:04:33午马
日期:2014-11-25 09:58:35辰龙
日期:2014-11-18 10:40:07寅虎
日期:2014-11-13 22:47:15申猴
日期:2014-10-22 15:29:50摩羯座
日期:2014-08-27 10:49:43辰龙
日期:2014-08-21 10:47:58
发表于 2012-04-09 11:42 |显示全部楼层
谢谢各位评委的辛苦总结,下面是参考答案:
  1. 1:
  2. FS是field separator, 默认下它代表空白字符集,包括空格,TABs和newline,而不是一个空格,可以理解为FS=[ \t\n]+。
  3. awk -F ' ' '{CMD' 等价于 awk '{CMD}'
  4. awk -F '[ ]'  FS代表单个空格,如果行首为空格,则第一个域(field)为空值。
  5. awk -F '[ ]+' FS代表多个连续空格。
  6. 示例:
  7. 字符串:'  (两个空格)foo1 foo2';

  8. echo '  foo1 foo2' |awk -F ' ' '{print $1,$2}'
  9. foo1 foo2

  10. echo '  foo1 foo2' |awk '{print $1,$2}'
  11. foo1 foo2

  12. echo '  foo1 foo2' |awk -F '[ ]' '{print $1,$2}'

  13. echo '  foo1 foo2' |awk -F '[ ]+' '{print $1,$2}'
  14. foo1
  15.   

  16. 2:
  17. 不一样:

  18. 不管是awk还是sed,默认下表达式/foo1/,/foo2/的布尔值为false

  19. awk '/foo1/,/foo2/'
  20. 当/foo1/为真,表达式的布尔值为true,执行其后的action(这里是print),
  21. 同时判断/foo2/是否为真,如果为真,匹配表达式的布尔值变成false,否则,不改变表达式的布尔值,直到/foo2/匹配为真。

  22. sed -n '/foo1/,/foo2/p'
  23. /foo1/为真,表达式的布尔值为true,执行其后的action(p指令),
  24. 和awk不同的是,sed是在/foo1/匹配为真的下一行,才对/foo2/进行判断,也就当读入下一行时,
  25. 同样,如果/foo2/为真,匹配表达式的布尔值变成false,否则,不改变表达式的布尔值,直到/foo2/匹配为真。

  26. 示例:
  27. cat file
  28. foo1 foo2
  29. foo2
  30. foo1
  31. xxx
  32. yyy
  33. foo2
  34. zzz

  35. awk '/foo1/,/foo2/' file
  36. foo1 foo2
  37. foo1
  38. xxx
  39. yyy
  40. foo2

  41. sed -n '/foo1/,/foo2/p' file
  42. foo1 foo2
  43. foo2
  44. foo1
  45. xxx
  46. yyy
  47. foo2


  48. 3:
  49. echo {a,b,c,e,f}{1,2,3}

  50. 4:
  51. echo 'aaabcccaaabbbccccbaaabb' |sed -nr 's/([^\n])\1*/&\n/g;:a;s/(^|\n)([^\n]+)(\n(.*\n)*)\2\n/\1\2\3/;ta;s/\n//gp'

  52. echo 'aaabcccaaabbbccccbaaabb' |awk -F '' '{while(i++<=NF){s=s$i;if($i!=$(i+1)){if(!a[s]++)printf s;s=""}}}'
  53. aaabcccbbbccccbb

  54. 5:
  55. 因为\<newline>解释在参数展开(parameters expansion)之前。

  56. 6:
  57. bash 对不在双引号中的参数展开的结果进行 word splitting 处理: 根据字段分隔符
  58. 把结果切割为多个word,最后再用单个space连接分割得到的多个word。而多个连续空
  59. 格被看作一个字段分隔符,所以最后foo与bar之间只有一个空格。

  60. 7:
  61. sed -n '/a/{p;:a;n;H;/c/{x;s/\n//p;z;h};ba}' file

  62. 8:
  63. seq 9|sed 'N;:a;N;s/\n/ /gp;s/\w* //;ta'
复制代码

论坛徽章:
49
15-16赛季CBA联赛之福建
日期:2016-06-22 16:22:002015年亚洲杯之中国
日期:2015-01-23 16:25:12丑牛
日期:2015-01-20 09:39:23未羊
日期:2015-01-14 23:55:57巳蛇
日期:2015-01-06 18:21:36双鱼座
日期:2015-01-02 22:04:33午马
日期:2014-11-25 09:58:35辰龙
日期:2014-11-18 10:40:07寅虎
日期:2014-11-13 22:47:15申猴
日期:2014-10-22 15:29:50摩羯座
日期:2014-08-27 10:49:43辰龙
日期:2014-08-21 10:47:58
发表于 2012-04-09 11:52 |显示全部楼层


代码有问题。。。你们有[S] [S]  [/S] [/S]的代码。。。。

论坛徽章:
2
射手座
日期:2014-10-10 15:59:4715-16赛季CBA联赛之上海
日期:2016-03-03 10:27:14
发表于 2012-04-09 12:06 |显示全部楼层
回复 73# send_linux


    老大,放到[code]里呢?

论坛徽章:
49
15-16赛季CBA联赛之福建
日期:2016-06-22 16:22:002015年亚洲杯之中国
日期:2015-01-23 16:25:12丑牛
日期:2015-01-20 09:39:23未羊
日期:2015-01-14 23:55:57巳蛇
日期:2015-01-06 18:21:36双鱼座
日期:2015-01-02 22:04:33午马
日期:2014-11-25 09:58:35辰龙
日期:2014-11-18 10:40:07寅虎
日期:2014-11-13 22:47:15申猴
日期:2014-10-22 15:29:50摩羯座
日期:2014-08-27 10:49:43辰龙
日期:2014-08-21 10:47:58
发表于 2012-04-09 13:13 |显示全部楼层
yinyuemi 发表于 2012-04-09 12:06
回复 73# send_linux


改好了,等会我一个一个编辑吧,每个答案放入一个代码框

论坛徽章:
0
发表于 2012-04-09 19:10 |显示全部楼层
本帖最后由 jiayanfu 于 2012-04-09 19:14 编辑

哈哈哈,第10名!哦也!
   可是还是不及格。。。。39分,难道连4道题都没有答对?囧了。。。哎。。。
可以的话,送我一本书吧,求鼓励!

论坛徽章:
8
摩羯座
日期:2014-11-26 18:59:452015亚冠之浦和红钻
日期:2015-06-23 19:10:532015亚冠之西悉尼流浪者
日期:2015-08-21 08:40:5815-16赛季CBA联赛之山东
日期:2016-01-31 18:25:0515-16赛季CBA联赛之四川
日期:2016-02-16 16:08:30程序设计版块每日发帖之星
日期:2016-06-29 06:20:002017金鸡报晓
日期:2017-01-10 15:19:5615-16赛季CBA联赛之佛山
日期:2017-02-27 20:41:19
发表于 2012-04-10 15:15 |显示全部楼层
鼠标能换包包吗?

论坛徽章:
0
发表于 2012-04-11 11:04 |显示全部楼层
啥时候发东西啊,坎肩换个书吧

论坛徽章:
49
15-16赛季CBA联赛之福建
日期:2016-06-22 16:22:002015年亚洲杯之中国
日期:2015-01-23 16:25:12丑牛
日期:2015-01-20 09:39:23未羊
日期:2015-01-14 23:55:57巳蛇
日期:2015-01-06 18:21:36双鱼座
日期:2015-01-02 22:04:33午马
日期:2014-11-25 09:58:35辰龙
日期:2014-11-18 10:40:07寅虎
日期:2014-11-13 22:47:15申猴
日期:2014-10-22 15:29:50摩羯座
日期:2014-08-27 10:49:43辰龙
日期:2014-08-21 10:47:58
发表于 2012-04-12 14:15 |显示全部楼层
waker 发表于 2012-04-10 15:15
鼠标能换包包吗?


这个可以,呵呵

论坛徽章:
49
15-16赛季CBA联赛之福建
日期:2016-06-22 16:22:002015年亚洲杯之中国
日期:2015-01-23 16:25:12丑牛
日期:2015-01-20 09:39:23未羊
日期:2015-01-14 23:55:57巳蛇
日期:2015-01-06 18:21:36双鱼座
日期:2015-01-02 22:04:33午马
日期:2014-11-25 09:58:35辰龙
日期:2014-11-18 10:40:07寅虎
日期:2014-11-13 22:47:15申猴
日期:2014-10-22 15:29:50摩羯座
日期:2014-08-27 10:49:43辰龙
日期:2014-08-21 10:47:58
发表于 2012-04-12 14:16 |显示全部楼层
xinyv 发表于 2012-04-11 11:04
啥时候发东西啊,坎肩换个书吧


可以。。。但是现在图书不全,你想要哪本书,我们这边先看看,是不是还要
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

DTCC2020中国数据库技术大会

【架构革新 高效可控】2020年12月21日-23日第十一届中国数据库技术大会将在北京隆重召开。

大会设置2大主会场,20+技术专场,将邀请超百位行业专家,重点围绕数据架构、AI与大数据、传统企业数据库实践和国产开源数据库等内容展开分享和探讨,为广大数据领域从业人士提供一场年度盛会和交流平台。

http://dtcc.it168.com


大会官网>>
  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP