免费注册 查看新帖 |

Chinaunix

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

[文本处理] 这个的问题大牛进;awk -F'|' 'NR==FNR{a[$2]=$0;next}{print a[$1] FS $2}' a b [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2013-05-31 17:34 |只看该作者 |倒序浏览
本帖最后由 123498296 于 2013-05-31 17:41 编辑

在看一个例子关于NR和FNR的典型应用:

[root@21 opt]#cat a
张三|000001
李四|000002

[root@21 opt]#cat b
000001|10
000001|20
000002|30
000002|15

#################################
想要得到的结果是将用户名,帐号和金额在同一行打印出来,如下:
张三|000001|10
张三|000001|20
李四|000002|30
李四|000002|15
#############################################
用如下语句处理后,得到以上结果:
awk -F'|' 'NR==FNR{a[$2]=$0;next}{print a[$1] FS $2}' a b
##########################################
1.第二个{}中的"a[$1]" 这个地方是什么意思? 大牛能不能详细解释下,越详细越好。
2.a[$1]与前面的数组a[$2]有什么联系,a[$1] 是如何处理第一个{}中的数组值的?
真的,越详细越好,先谢大牛帮忙解答先。

论坛徽章:
93
2015年辞旧岁徽章
日期:2019-10-10 10:51:15CU大牛徽章
日期:2014-02-21 14:21:56CU十二周年纪念徽章
日期:2020-10-15 16:55:55CU大牛徽章
日期:2014-02-21 14:22:07羊年新春福章
日期:2019-10-10 10:51:39CU大牛徽章
日期:2019-10-10 10:55:38季节之章:春
日期:2020-10-15 16:57:40ChinaUnix元老
日期:2019-10-10 10:54:42季节之章:冬
日期:2019-10-10 10:57:17CU大牛徽章
日期:2014-02-21 14:22:52CU大牛徽章
日期:2014-03-13 10:40:30CU大牛徽章
日期:2014-02-21 14:23:15
2 [报告]
发表于 2013-05-31 18:17 |只看该作者
1.第二个{}中的"a[$1]" 这个地方是什么意思? 大牛能不能详细解释下,越详细越好。
2.a[$1]与前面的数组a[$2]有什么联系,a[$1] 是如何处理第一个{}中的数组值的?
两个问题一起回答比较容易一点的样子。
这里处理的是第二个文件,那么第二个文件的第一个域就是用来连接第一个文件的第二个域的嘛,在NR==FNR{a[$2]=$0;next}将第一个文件的第二个域用来做下标了,再用第二个文件的第一个域来取,不是达到你想要的效果了嘛。

听着感觉绕口令了,还是用程序来的简洁啊。

论坛徽章:
145
技术图书徽章
日期:2013-10-01 15:32:13戌狗
日期:2013-10-25 13:31:35金牛座
日期:2013-11-04 16:22:07子鼠
日期:2013-11-18 18:48:57白羊座
日期:2013-11-29 10:09:11狮子座
日期:2013-12-12 09:57:42白羊座
日期:2013-12-24 16:24:46辰龙
日期:2014-01-08 15:26:12技术图书徽章
日期:2014-01-17 13:24:40巳蛇
日期:2014-02-18 14:32:59未羊
日期:2014-02-20 14:12:13白羊座
日期:2014-02-26 12:06:59
3 [报告]
发表于 2013-05-31 18:49 |只看该作者
回复 1# 123498296

How about below:

awk -F'|' 'NR==FNR{a[$2]=$0;next}{print a[$1] FS $2}' a b

There is no BEGIN block, and FS="|" by -F'|' argument

start to first file 'a'
1. read file a line 1 and get data 张三|000001
  A: $0=张三|000001
  B: $1=张三
  C: $2=000001

  NR and FNR are the same equal to 1, and run NR=FNR block
  NR==FNR{a[$2]=$0;next}
    A: a[$2]=$0
      a[000001]=张三|000001
    B: next
      next cycle and get next line data
  
2. read file a line 2 and get data 李四|000002
  A: $0=李四|000002
  B: $1=李四
  C: $2=000002

  NR and FNR are the same equal to 2, and run NR=FNR block
  NR==FNR{a[$2]=$0;next}
  A: a[$2]=$0
    a[000002]=李四|000002
  B: next
    next cycle and get next line data

end of the file a, and get next file b data

3. read file b line 1, and get data 000001|10
  A: $0=000001|10
  B: $1=000001
  C: $2=10

  now, NR is 3 and FNR is 1, they are not eqaul
  and didn't run NR=FNR block,
  and run next block {print a[$1] FS $2}
    a[$1] => a[000001] => 张三|000001
    FS => |
    $2 => 10
    you will see the output
      张三|000001|10

4. read file b line 2, and get data 000001|20
  A: $0=000001|20
  B: $1=000001
  C: $2=20

  NR is 4 and FNR is 2, they are not eqaul
  and didn't run NR=FNR block,
  and run next block {print a[$1] FS $2}
    a[$1] => a[000001] => 张三|000001
    FS => |
    $2 => 20
    you will see the output
    张三|000001|20

cycle to read the file b  
5. read file b line 3, and get data 000002|30
  ...
  output==> 李四|000002|30

6. read file b line 4, and get data 000002|15
  ...
  output==> 李四|000002|15
   

论坛徽章:
0
4 [报告]
发表于 2013-05-31 23:11 |只看该作者
回复 3# jason680


    英文好牛

论坛徽章:
0
5 [报告]
发表于 2013-06-01 10:27 |只看该作者
你仔细看看
域分割符为"|"    第一个文件的$2就是第二个文件的$1

论坛徽章:
0
6 [报告]
发表于 2013-06-01 14:53 |只看该作者
回复 5# yinwei2012


    发现这个情况了;
第一个{}里面的a[$2]从第一个文件中取到值,其实等于第二个{} a[$1]从第二个文件中取到值,
这样;

NR==FNR{a[$2]=$0;next;}
a[$2]($2是获取的第一个文件a中的值)==>>a[000001]

{print a[$1] FS $2}' a b
a[$1]($1是获取的第二个文件b中的值)==>>a[000001]

So:
打印第二个文件的时候a[$1]==>>a[000001](得到这样的数组匹配第一个{}中a[$2]是相等的)==>>a[$2]===>>张三|000001



论坛徽章:
381
CU十二周年纪念徽章
日期:2014-01-04 22:46:58CU大牛徽章
日期:2013-03-13 15:32:35CU大牛徽章
日期:2013-03-13 15:38:15CU大牛徽章
日期:2013-03-13 15:38:52CU大牛徽章
日期:2013-03-14 14:08:55CU大牛徽章
日期:2013-04-17 11:17:19CU大牛徽章
日期:2013-04-17 11:17:32CU大牛徽章
日期:2013-04-17 11:17:37CU大牛徽章
日期:2013-04-17 11:17:42CU大牛徽章
日期:2013-04-17 11:17:47CU大牛徽章
日期:2013-04-17 11:17:52CU大牛徽章
日期:2013-04-17 11:17:56
7 [报告]
发表于 2013-06-01 21:32 |只看该作者
3楼讲解的过程很详细,学习了

论坛徽章:
16
IT运维版块每日发帖之星
日期:2015-10-02 06:20:00IT运维版块每月发帖之星
日期:2015-09-11 19:30:52IT运维版块每周发帖之星
日期:2015-09-11 19:20:31IT运维版块每日发帖之星
日期:2015-08-26 06:20:00每日论坛发贴之星
日期:2015-08-20 06:20:00IT运维版块每日发帖之星
日期:2015-08-20 06:20:002015年辞旧岁徽章
日期:2015-03-03 16:54:15金牛座
日期:2014-05-04 16:58:09双子座
日期:2013-12-17 16:44:37辰龙
日期:2013-11-22 15:20:59狮子座
日期:2013-11-18 22:55:08射手座
日期:2013-11-12 10:54:26
8 [报告]
发表于 2013-06-01 21:54 |只看该作者
man awk ;please check next and NF,FNR record description , you will get more that this case!

论坛徽章:
0
9 [报告]
发表于 2013-10-25 11:52 |只看该作者
回复 3# jason680


    讲解太精彩了,学习了

论坛徽章:
2
15-16赛季CBA联赛之八一
日期:2017-07-06 14:20:4715-16赛季CBA联赛之上海
日期:2017-08-21 22:14:34
10 [报告]
发表于 2017-06-16 14:37 |只看该作者
本帖最后由 irockey 于 2017-06-16 15:00 编辑

error
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP