免费注册 查看新帖 |

Chinaunix

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

做实验碰到的一个问题 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2007-11-18 15:06 |只看该作者 |倒序浏览
cat file1:
0011AAA 200.00 20050321
0012BBB 300.00 20050621
0013DDD 400.00 20050622
0014FFF 500.00 20050401

cat file2:
I0011  11111
I0012  22222
I0014  55555
I0013  66666

规则:比较 file1的1-4字符 和 file2的2-5 字符,如果相同,将file2 的第二列 与 file1 合并 file3

0011AAA 200.00 20050321 11111
0012BBB 300.00 20050621 22222
0013DDD 400.00 20050622 66666
0014FFF 500.00 20050401 55555


awk  'NR==FNR{a[substr($1,2,5)]=$2}NR>FNR&&a[b=substr($1,1,4)]{print $0, a}' file2 file1 >file3
[networker@postfix networker]$ awk  'NR==FNR{a[substr($1,2,5)]=$2}NR>FNR&&a[b=substr($1,1,4)]{print $0, a}' file2 file1 >file3
awk: cmd. line:1: (FILENAME=file1 FNR=1) fatal: attempt to use array `a' in a scalar context
[networker@postfix networker]$ awk -W version
GNU Awk 3.1.1
Copyright (C) 1989, 1991-2002 Free Software Foundation.

论坛徽章:
1
荣誉会员
日期:2011-11-23 16:44:17
2 [报告]
发表于 2007-11-18 16:45 |只看该作者
格式固定的话, 就paste一下呗

论坛徽章:
23
15-16赛季CBA联赛之吉林
日期:2017-12-21 16:39:27白羊座
日期:2014-10-27 11:14:37申猴
日期:2014-10-23 08:36:23金牛座
日期:2014-09-30 08:26:49午马
日期:2014-09-29 09:40:16射手座
日期:2014-11-25 08:56:112015年辞旧岁徽章
日期:2015-03-03 16:54:152015年迎新春徽章
日期:2015-03-04 09:49:0315-16赛季CBA联赛之山东
日期:2017-12-21 16:39:1915-16赛季CBA联赛之广东
日期:2016-01-19 13:33:372015亚冠之山东鲁能
日期:2015-10-13 09:39:062015亚冠之西悉尼流浪者
日期:2015-09-21 08:27:57
3 [报告]
发表于 2007-11-18 17:08 |只看该作者
awk  'NR==FNR{a[substr($1,2,4)]=$2}NR>FNR{print $0,a[substr($1,1,4)]}' file2 file1 >file3

论坛徽章:
0
4 [报告]
发表于 2007-11-18 18:24 |只看该作者
原帖由 ly5066113 于 2007-11-18 17:08 发表
awk  'NR==FNR{a[substr($1,2,4)]=$2}NR>FNR{print $0,a[substr($1,1,4)]}' file2 file1 >file3

还有就是谁能帮我解释一下错误的提示,谢谢

[ 本帖最后由 小N哥哥 于 2007-11-18 18:29 编辑 ]

论坛徽章:
0
5 [报告]
发表于 2007-11-18 18:27 |只看该作者
原帖由 ly5066113 于 2007-11-18 17:08 发表
awk  'NR==FNR{a[substr($1,2,4)]=$2}NR>FNR{print $0,a[substr($1,1,4)]}' file2 file1 >file3


这句里的a[]不理解呀,另外这里的$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
6 [报告]
发表于 2007-11-18 18:28 |只看该作者
a是数组,是不能直接print的,能print的是一个数组元素

论坛徽章:
0
7 [报告]
发表于 2007-11-18 18:31 |只看该作者
原帖由 waker 于 2007-11-18 18:28 发表
a是数组,是不能直接print的,能print的是一个数组元素

a scalar context是什么意思啊,查找了GOOGLE,发现这个东西和PERL的关系比较密切。Waker大牛

论坛徽章:
0
8 [报告]
发表于 2007-11-18 18:34 |只看该作者
原帖由 灿烂小猪 于 2007-11-18 18:27 发表


这句里的a[]不理解呀,另外这里的$2是哪一列呀?请大害帮忙解释解释,或提供点资料.谢谢.

NR<=FNR是指正在处理的文件,NR>FNR就是指另外的那个文件

论坛徽章:
0
9 [报告]
发表于 2007-11-18 19:25 |只看该作者
awk  'NR==FNR{a[substr($1,2,4)]=$2}NR>FNR{print $0,a[substr($1,1,4)]}' file2 file1 >file3


这里NR==FNR是判断当file2中的记录号与file1中的记录号相等时,使用数组取file2里的值a[substr($1,2,4)]实际上是a[0011],将$2也就是11111赋给数组a[0011],当file2的NR值大于file1的值(也就是file2跳到下一行时),打印file1的所以列,并打印数组a[substr($1,1,4)]即file1第一列的第一个字母开始,宽度为字a[0011](为11111)的值。循环执行,直到执行完file2的最后一行。

其中NR==FNR是因为file2的行少,并要将file2中每一行的$2的值放入数组中吧。这是我的理解,还有两个地方不理解,1.什么时候是第file2中的$1,$2,什么时候是指file1中的$1,$2。2.$0是指文档的所有内容,在这里是指第一行的所有内容么?

NR<=FNR是指正在处理的文件,NR>FNR就是指另外的那个文件


这句里NR<=FNR应该是NR==FNR吧?另外这句话我不理解,有相关的教程么?我学习学习。

有理解不对或错误的地方请大家指正,谢谢大家。

论坛徽章:
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
10 [报告]
发表于 2007-11-19 09:08 |只看该作者

回复 #7 小N哥哥 的帖子

scalar 标量 单独的值
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP