免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
楼主: ywxwillam
打印 上一主题 下一主题

问个awk的问题 [复制链接]

论坛徽章:
0
11 [报告]
发表于 2009-01-09 10:00 |只看该作者
awk '!a[$0]++{print $0}'

论坛徽章:
0
12 [报告]
发表于 2009-01-09 10:02 |只看该作者
awk -F "\n" ' {a[$1]++}END{for ( i in a) print i} ' file

行吗?

论坛徽章:
11
金牛座
日期:2015-03-19 16:56:22数据库技术版块每日发帖之星
日期:2016-08-02 06:20:00数据库技术版块每日发帖之星
日期:2016-04-24 06:20:00数据库技术版块每日发帖之星
日期:2016-04-13 06:20:00IT运维版块每日发帖之星
日期:2016-04-13 06:20:00数据库技术版块每日发帖之星
日期:2016-02-03 06:20:00数据库技术版块每日发帖之星
日期:2015-08-06 06:20:00季节之章:春
日期:2015-03-27 15:54:57羊年新春福章
日期:2015-03-27 15:54:37戌狗
日期:2015-03-19 16:56:41数据库技术版块每日发帖之星
日期:2016-08-18 06:20:00
13 [报告]
发表于 2009-01-09 10:08 |只看该作者
原帖由 ynchnluiti 于 2009-1-9 09:51 发表

?

先判断! a[$0],  再a[$0]++


有点理解了..再有个问题....为什么1中会出现重复值呢???
1.
awk 'a[$0]++{for (i in a){print i}}' 输出
1,2,2008-12-24 9:00
2,3,2008-12-24 9:01
1,2,2008-12-24 9:00

2.
awk '{a[$0]++}END{for (i in a){print i}}' 输出..
2,3,2008-12-24 9:01
1,2,2008-12-24 9:00
1,2,2008-12-24 9:05

论坛徽章:
0
14 [报告]
发表于 2009-01-09 10:40 |只看该作者
刚上手,说的对不对请老师们指正。
1.awk 'a[$1]++{for (i in a){print i}}'执行时,指令"a[$1]++{for (i in a){print i}}"操作每一行。
2.awk '{a[$1]++}END{for (i in a){print i}}'执行时,指令"{a[$1]++}"先操作每一行。全部操作完毕,最后一步执行"{for (i in a){print i}"指令,END模块是用于避免和"{a[$1]++}"混合,出现1的情况。

论坛徽章:
3
戌狗
日期:2014-09-10 17:07:162015年辞旧岁徽章
日期:2015-03-03 16:54:15wusuopu
日期:2016-06-17 17:43:45
15 [报告]
发表于 2009-01-09 10:50 |只看该作者

回复 #13 liaosnet 的帖子

看看14楼的,简单说就是
1 处理每行时都执行{for .. print},输出当前行内容
2 只在END{}里输出。之前处理每行,给数组赋值时,键值相等的会覆盖,留下来的就是不重复的了。

论坛徽章:
0
16 [报告]
发表于 2009-01-09 10:55 |只看该作者

谢谢

谢谢老师的指正。

论坛徽章:
11
金牛座
日期:2015-03-19 16:56:22数据库技术版块每日发帖之星
日期:2016-08-02 06:20:00数据库技术版块每日发帖之星
日期:2016-04-24 06:20:00数据库技术版块每日发帖之星
日期:2016-04-13 06:20:00IT运维版块每日发帖之星
日期:2016-04-13 06:20:00数据库技术版块每日发帖之星
日期:2016-02-03 06:20:00数据库技术版块每日发帖之星
日期:2015-08-06 06:20:00季节之章:春
日期:2015-03-27 15:54:57羊年新春福章
日期:2015-03-27 15:54:37戌狗
日期:2015-03-19 16:56:41数据库技术版块每日发帖之星
日期:2016-08-18 06:20:00
17 [报告]
发表于 2009-01-09 11:09 |只看该作者

回复 #15 ynchnluiti 的帖子

那也不对呀...最后一行也就是第五行的值跟第一行不同...可1.输出的最后一行跟第一行相同......

[ 本帖最后由 liaosnet 于 2009-1-9 12:47 编辑 ]

论坛徽章:
0
18 [报告]
发表于 2009-01-09 12:00 |只看该作者
谢谢各位啦  可以了  学习了  请问哪儿有awk的文档  我想深入研究一下

论坛徽章:
0
19 [报告]
发表于 2009-01-09 13:24 |只看该作者
回复 #15 ynchnluiti 的帖子


那也不对呀...最后一行也就是第五行的值跟第一行不同...可1.输出的最后一行跟第一行相同......

[ 本帖最后由 liaosnet 于 2009-1-9 12:47 编辑 ]

1  里面的a[$1]++ 在这里既是赋值语句也是判断语句,如果字符串数组值为真则进行for循环,for
  循环是以散列方式打印出当时的数组下标,并不是以序列方式打印出来。可以用纸笔在下面模拟写一下过程。

论坛徽章:
3
戌狗
日期:2014-09-10 17:07:162015年辞旧岁徽章
日期:2015-03-03 16:54:15wusuopu
日期:2016-06-17 17:43:45
20 [报告]
发表于 2009-01-09 13:43 |只看该作者
原帖由 liaosnet 于 2009-1-9 11:09 发表
那也不对呀...最后一行也就是第五行的值跟第一行不同...可1.输出的最后一行跟第一行相同......

楼上说的对。刚才我写的 漏了{for ..}前的判断,每行时都判断a[$0]的值,然后++。
看看14楼的,简单说就是
1 处理每行时都执行{for .. print},输出当前行内容
2 只在END{}里输出。之前处理每行,给数组赋值时,键值相等的会覆盖,留下来的就是不重复的了。

  1. cat a1
  2. 1,2,2008-12-24 9:00
  3. 1,2,2008-12-24 9:00
  4. 2,3,2008-12-24 9:01
  5. 2,3,2008-12-24 9:01
  6. 1,2,2008-12-24 9:05
  7. ==================
  8. $ awk 'a[$0]++{print "line:"NR"-------";for (i in a){print i}}' a1
  9. line:2-------
  10. 1,2,2008-12-24 9:00
  11. line:4-------
  12. 1,2,2008-12-24 9:00
  13. 2,3,2008-12-24 9:01
复制代码
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP