免费注册 查看新帖 |

Chinaunix

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

[文本处理] awk for 基础问题 [复制链接]

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

昨晚看书,书上有一个列子这样的:
  1. awk '{name[x++]=$2};END{for(i=0;i<NR;i++) print i,name[i]}' 1
复制代码
想不通后面的
  1. name[i]
复制代码
是怎么回事,求大神耐心解答,别嫌我的问题低级啊。

论坛徽章:
60
20周年集字徽章-20	
日期:2020-10-28 14:04:3015-16赛季CBA联赛之北京
日期:2016-07-06 15:42:0715-16赛季CBA联赛之同曦
日期:2016-06-12 10:38:0915-16赛季CBA联赛之佛山
日期:2016-05-27 11:54:56黄金圣斗士
日期:2015-12-02 11:44:35白银圣斗士
日期:2015-11-25 14:32:43白银圣斗士
日期:2015-11-23 12:53:352015亚冠之布里斯班狮吼
日期:2015-10-21 16:55:482015亚冠之首尔
日期:2015-09-01 16:46:052015亚冠之德黑兰石油
日期:2015-08-31 11:39:192015亚冠之萨济拖拉机
日期:2015-08-28 21:06:5315-16赛季CBA联赛之广东
日期:2016-07-12 14:58:53
2 [报告]
发表于 2013-11-13 09:44 |只看该作者
i 是 下表,name[i] 就的对应的这个下标的值啊。比如:

name[1]=a
name[2]=b

for(i in name)print i,name[i] // 这里i就是这个name数组的下标1,而name[i]就是对应的值a ,完了之后继续下次循环,则是i对应2,name[i]对应b, do you understand ?

论坛徽章:
0
3 [报告]
发表于 2013-11-13 09:45 |只看该作者
回复 1# wang390750

就一数组,对应用 name[x++]=$2  的值

name[0]=$2
name[1]=$2
。。。。。。
   

论坛徽章:
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
4 [报告]
发表于 2013-11-13 09:54 |只看该作者

论坛徽章:
0
5 [报告]
发表于 2013-11-13 09:55 |只看该作者
本帖最后由 wang390750 于 2013-11-13 10:00 编辑

回复 2# reyleon
  1.     awk '{name[x++]=$2};END{for(i=0;i<NR;i++) print i,name[i]}' 1
复制代码
name[x++]    下标是x啊,   后面加了一句for(i=0;i<NR;i++)  最后就能打印
  1. name[i]
复制代码
。  
我不明白他们是怎么关联上的。。。。

论坛徽章:
0
6 [报告]
发表于 2013-11-13 10:19 |只看该作者
本帖最后由 wang390750 于 2013-11-13 10:20 编辑

回复 3# yaozhibing41001


    不知道我这样能解是否正确啊。
   name[x++]=$2  这儿下标是x   值是$2
   x++ 第一次为1  第二次为2
  
   for(i=0;i<NR;i++)
   i++ 的值为1  逐渐增加
  然后 x   ==   i
  1.   所以打印  name [i]    就等于打印 name [x]的值  $2
复制代码

论坛徽章:
15
2015年辞旧岁徽章
日期:2015-03-03 16:54:15双鱼座
日期:2015-01-15 17:29:44午马
日期:2015-01-06 17:06:51子鼠
日期:2014-11-24 10:11:13寅虎
日期:2014-08-18 07:10:55酉鸡
日期:2014-04-02 12:24:51双子座
日期:2014-04-02 12:19:44天秤座
日期:2014-03-17 11:43:36亥猪
日期:2014-03-13 08:13:51未羊
日期:2014-03-11 12:42:03白羊座
日期:2013-11-20 10:15:18CU大牛徽章
日期:2013-04-17 11:48:45
7 [报告]
发表于 2013-11-13 10:35 |只看该作者
本帖最后由 rdcwayx 于 2013-11-13 10:37 编辑

其实这题里,x++有些问题,用++x 可能更好。x 在没有赋值前,并不一定为 0 的,当然后面的代码也要跟着调整。  

x 的值作为下标给关联数组 name , 调用或者赋值时,是没有这个name[x] 数组的。 系统里存放着是 name[1], name[2].

而且按照题意, 没必要再引入个变量x, NR或者FNR已经满足条件了:
  1. awk '{name[NR]=$2}END{for(i=1;i<=NR;i++) print i,name[i]}' 1
复制代码

论坛徽章:
0
8 [报告]
发表于 2013-11-13 10:44 |只看该作者
回复 7# rdcwayx


    谢谢版本,似乎已经已经明白了。

论坛徽章:
60
20周年集字徽章-20	
日期:2020-10-28 14:04:3015-16赛季CBA联赛之北京
日期:2016-07-06 15:42:0715-16赛季CBA联赛之同曦
日期:2016-06-12 10:38:0915-16赛季CBA联赛之佛山
日期:2016-05-27 11:54:56黄金圣斗士
日期:2015-12-02 11:44:35白银圣斗士
日期:2015-11-25 14:32:43白银圣斗士
日期:2015-11-23 12:53:352015亚冠之布里斯班狮吼
日期:2015-10-21 16:55:482015亚冠之首尔
日期:2015-09-01 16:46:052015亚冠之德黑兰石油
日期:2015-08-31 11:39:192015亚冠之萨济拖拉机
日期:2015-08-28 21:06:5315-16赛季CBA联赛之广东
日期:2016-07-12 14:58:53
9 [报告]
发表于 2013-11-13 10:44 |只看该作者
name[x++]=$2

你理解了x++就明白了,先赋值,再自增。

读取第一行的时候,NR=1,x++,是先赋值,根据上下文确定x=0,则name[0]=$2,然后x++,x被赋值了,即x=1;结束第一行的处理,下标0对应文本的第一行,即对应NR=1
读取第二行的时候,NR=2,从上面可知,x=1,所以name[1]=$2,然后x++,自增1,所以x=2了,结束第二行的处理,继续。下标1对应文本的第一行,即对应NR=2
读取第三行的时候,NR=3,从上面可知,x=2,所以name[2]=$2,然后,然后你就懂了...

当读取玩所有行的之后就执行END后的代码。

for(i=0;i<NR;i++)从0开始,so....


其实或许对你这样更容易理解:
  1. awk '{name[NR]=$2};END{for(i=1;i<=NR;i++) print i,name[i]}' 1
复制代码

论坛徽章:
0
10 [报告]
发表于 2013-11-13 10:48 |只看该作者
回复 9# reyleon


    感谢大神,明白了。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP