免费注册 查看新帖 |

Chinaunix

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

[文本处理] 求助各位解释下一个AWK数组赋值的问题,有点搞不明白NR==FNR{a[$2]=$0;next [复制链接]

论坛徽章:
2
狮子座
日期:2014-08-15 00:24:232015元宵节徽章
日期:2015-03-06 15:52:30
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2014-09-25 00:35 |只看该作者 |倒序浏览
我在帖子里面看了一个例子如下:

  1. #cat account
  2. 张三|000001
  3. 李四|000002
  4. #cat cdr
  5. 000001|10
  6. 000001|20
  7. 000002|30
  8. 000002|15

  9. 想要得到的结果是将用户名,帐号和金额在同一行打印出来,如下:
  10. 张三|000001|10
  11. 张三|000001|20
  12. 李四|000002|30
  13. 李四|000002|15

  14. 执行如下代码
  15. #awk -F \| 'NR==FNR{a[$2]=$0;next}{print a[$1]"|"$2}' account cdr
复制代码
NR和FNR我看明白了,但是数组那不清楚。a[$2]=$0  这个是在给a赋值吗。a应该是等于account的所有吧,那[$2]是干嘛的呢?

论坛徽章:
32
处女座
日期:2013-11-20 23:41:20双子座
日期:2014-06-11 17:20:43戌狗
日期:2014-06-16 11:05:00处女座
日期:2014-07-22 17:30:47狮子座
日期:2014-07-28 15:38:17金牛座
日期:2014-08-05 16:34:01亥猪
日期:2014-08-18 13:34:25白羊座
日期:2014-09-02 15:03:55金牛座
日期:2014-11-10 10:23:58处女座
日期:2014-12-02 09:17:52程序设计版块每日发帖之星
日期:2015-06-16 22:20:002015亚冠之塔什干火车头
日期:2015-06-20 23:28:22
2 [报告]
发表于 2014-09-25 00:48 |只看该作者
这是数组~

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

论坛徽章:
8
戌狗
日期:2014-09-26 16:39:44水瓶座
日期:2014-10-10 02:06:57金牛座
日期:2014-10-11 23:04:042015亚冠之首尔
日期:2015-06-23 15:37:0015-16赛季CBA联赛之天津
日期:2016-01-22 18:58:2915-16赛季CBA联赛之佛山
日期:2016-05-31 19:18:0815-16赛季CBA联赛之同曦
日期:2016-08-10 16:26:3315-16赛季CBA联赛之辽宁
日期:2018-01-10 11:47:40
4 [报告]
发表于 2014-09-25 01:37 |只看该作者
a[$2]=$0 这个就相当于:

a[000001] = 张三|000001
a[000002] = 李四|000002

print a[$1]"|"$2 相当于:

a[000001] | 10  =  张三|000001|10

下面的以此类推




论坛徽章:
1
处女座
日期:2014-09-18 16:18:00
5 [报告]
发表于 2014-09-25 08:35 |只看该作者
楼主可以了解下关联数组,很好用的

论坛徽章:
2
摩羯座
日期:2014-11-03 15:28:56卯兔
日期:2015-01-04 17:20:51
6 [报告]
发表于 2014-09-25 08:48 |只看该作者
awk的hash数组,下标不是从0开始累加,是自己设定key-value的映射关系
所以遍历数组下标的时候,也不会自己排序~~~

论坛徽章:
0
7 [报告]
发表于 2014-09-25 11:01 |只看该作者
本帖最后由 louis0o0 于 2014-09-25 11:12 编辑

就像楼上所说,awk里面的数组,你可以理解为c++的hash_map,你用到的时候,就创建了这样的键值对。

补充一点,awk中如果用到a[XXX](注意,初始没赋值,你的例子中是赋值了的)的形式,初始值默认为0。

论坛徽章:
32
处女座
日期:2013-11-20 23:41:20双子座
日期:2014-06-11 17:20:43戌狗
日期:2014-06-16 11:05:00处女座
日期:2014-07-22 17:30:47狮子座
日期:2014-07-28 15:38:17金牛座
日期:2014-08-05 16:34:01亥猪
日期:2014-08-18 13:34:25白羊座
日期:2014-09-02 15:03:55金牛座
日期:2014-11-10 10:23:58处女座
日期:2014-12-02 09:17:52程序设计版块每日发帖之星
日期:2015-06-16 22:20:002015亚冠之塔什干火车头
日期:2015-06-20 23:28:22
8 [报告]
发表于 2014-09-25 11:31 |只看该作者
回复 7# louis0o0

谁跟你说初始值为0的?
   

论坛徽章:
0
9 [报告]
发表于 2014-09-25 11:58 |只看该作者
大神这一说提醒我了,哈哈,我错了。后面用了数值运算,比如++的话,就当作数值0初始化了,不然就是空的,是吧?

回复 8# yestreenstars


   

论坛徽章:
32
处女座
日期:2013-11-20 23:41:20双子座
日期:2014-06-11 17:20:43戌狗
日期:2014-06-16 11:05:00处女座
日期:2014-07-22 17:30:47狮子座
日期:2014-07-28 15:38:17金牛座
日期:2014-08-05 16:34:01亥猪
日期:2014-08-18 13:34:25白羊座
日期:2014-09-02 15:03:55金牛座
日期:2014-11-10 10:23:58处女座
日期:2014-12-02 09:17:52程序设计版块每日发帖之星
日期:2015-06-16 22:20:002015亚冠之塔什干火车头
日期:2015-06-20 23:28:22
10 [报告]
发表于 2014-09-25 11:59 |只看该作者
回复 9# louis0o0

其实不应该说默认值为空,说没有值可能更合适~
   
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP