免费注册 查看新帖 |

Chinaunix

广告
  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 1814 | 回复: 9
打印 上一主题 下一主题

[文本处理] awk代码理解问题 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2018-04-09 22:35 |只看该作者 |倒序浏览
学习过程中遇到点迷惑的地方,希望各路大神指点迷津:
下面两个代码都是对文件进行合并,作用一样,疑问:

Q1:第一句里的if (a[$1])改如何理解呢,如果写成if($0 in a)我就理解了?
Q2:第二句里的length(a[$1])不明白了,是否是作为一个pattern? 或者

awk 'NR==FNR{a[$1]=$0;next}NR>FNR{if (a[$1]) print a[$1]"\t"$2}' 1 2

awk 'NR==FNR{a[$1]=$0;next}length(a[$1]){print a[$1]"\t"$2}' 1 2



谢谢谢谢!!!

论坛徽章:
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
2 [报告]
发表于 2018-04-09 23:52 |只看该作者
回复 1# SheIsTheOne

Q1: if(Condition)...
  Condition will be false:
  1. 0,  zero of number
  2. "", empty of string
  other case will be true

$ awk 'BEGIN{a=0;if(a)print "true";else print"false"}'
false
$ awk 'BEGIN{a="";if(a)print "true";else print"false"}'
false
$ awk 'BEGIN{a=" ";if(a)print "true";else print"false"}'                # note: " " string               
true
$ awk 'BEGIN{a="0";if(a)print "true";else print"false"}'               # note: "0" string
true


Q2: awk 'pattern{action}pattern{action}...'


awk 'NR==FNR{a[$1]=$0;next}NR>FNR{if (a[$1]) print a[$1]"\t"$2}' 1 2

awk 'NR==FNR{a[$1]=$0;next}length(a[$1]){print a[$1]"\t"$2}' 1 2

论坛徽章:
0
3 [报告]
发表于 2018-04-10 09:22 |只看该作者
回复 2# jason680

谢谢谢谢,我又搜集了一些信息,结合您的回答,理解思路如下,不知道有没有错误之处:

awk 'NR==FNR{a[$1]=$0;next}NR>FNR{if (a[$1]) print a[$1]"\t"$2}' 1 2

针对这一句,访问第一个文件的时候,建立数组,将每一行作为元素,并且以第一列作为数组的下标;
但是到第二个if (a[$1]) 的时候,这里的a[$1]并不是一个数组,而是通过2文件的下标来访问a数组的元素,如果可以访问,则条件为真。。。即($1 in a)


awk 'NR==FNR{a[$1]=$0;next}length(a[$1]){print a[$1]"\t"$2}' 1 2

这个代码,length(a[$1])起到判断作用,同样是通过2文件的下标来访问a数组的内容,如果可以访问,则length(a[$1])非空,条件为真,,,

不知道这样理解起来对不对

论坛徽章:
0
4 [报告]
发表于 2018-04-10 12:38 |只看该作者
提示: 作者被禁止或删除 内容自动屏蔽

论坛徽章:
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
5 [报告]
发表于 2018-04-10 13:14 |只看该作者
回复 5# 本友会机友会摄友会


垃圾是放错地方的资源
https://wenku.baidu.com/view/347ebbb31a37f111f1855b19.html

PowerShell的是windows的专有脚本
用在这,肯定放错地方

强简 “死”的是你
http://bbs.chinaunix.net/thread-4263951-1-1.html

论坛徽章:
33
ChinaUnix元老
日期:2015-02-02 08:55:39CU十四周年纪念徽章
日期:2019-08-20 08:30:3720周年集字徽章-周	
日期:2020-10-28 14:13:3020周年集字徽章-20	
日期:2020-10-28 14:04:3019周年集字徽章-CU
日期:2019-09-08 23:26:2519周年集字徽章-19
日期:2019-08-27 13:31:262016科比退役纪念章
日期:2022-04-24 14:33:24
6 [报告]
发表于 2018-04-10 13:34 |只看该作者
回复 3# SheIsTheOne

这样理解冇问题

论坛徽章:
0
7 [报告]
发表于 2018-04-11 12:09 |只看该作者
回复 7# Shell_HAT

望指点

论坛徽章:
0
8 [报告]
发表于 2018-04-11 14:24 |只看该作者
提示: 作者被禁止或删除 内容自动屏蔽

论坛徽章:
25
程序设计版块每日发帖之星
日期:2016-05-03 06:20:0015-16赛季CBA联赛之八一
日期:2018-07-05 10:34:09黑曼巴
日期:2018-07-06 15:19:5015-16赛季CBA联赛之佛山
日期:2018-08-03 13:19:3315-16赛季CBA联赛之山西
日期:2018-08-07 19:46:2315-16赛季CBA联赛之广夏
日期:2018-08-08 19:31:5015-16赛季CBA联赛之青岛
日期:2018-11-26 15:21:5015-16赛季CBA联赛之上海
日期:2018-12-11 09:45:3219周年集字徽章-年
日期:2020-04-18 23:54:5215-16赛季CBA联赛之深圳
日期:2020-04-19 21:40:19黑曼巴
日期:2022-04-03 17:55:1315-16赛季CBA联赛之八一
日期:2018-07-03 16:56:46
9 [报告]
发表于 2018-04-11 14:36 |只看该作者
本帖最后由 wh7211 于 2018-04-11 14:45 编辑

回复 3# SheIsTheOne


这里的a[$1]并不是一个数组,而是通过2文件的下标来访问a数组的元素

a[$1]是在第1个文件中定义的,即a[$1]=$0。在处理第2个文件时,if(a[$1])的意思是“判断a[$1]的值是否为真”,如果文件2的$1在文件1中出现过则a[$1]为真,那么就执行后面的print指令
length(a[$1])起到判断作用,同样是通过2文件的下标来访问a数组的内容

这里的length(a[$1])是模式,返回值是a[$1]数组的长度,如果文件2的$1在文件1中出现过则length(a[$1])的返回值为真,那么就执行后面的print指令

论坛徽章:
20
程序设计版块每日发帖之星
日期:2015-10-11 06:20:0015-16赛季CBA联赛之山东
日期:2016-05-28 18:18:5615-16赛季CBA联赛之新疆
日期:2017-04-12 22:55:4715-16赛季CBA联赛之青岛
日期:2017-06-26 18:30:0315-16赛季CBA联赛之四川
日期:2017-09-04 12:27:0315-16赛季CBA联赛之福建
日期:2018-02-09 14:28:3315-16赛季CBA联赛之同曦
日期:2018-04-17 12:43:3415-16赛季CBA联赛之浙江
日期:2018-07-14 13:27:4015-16赛季CBA联赛之吉林
日期:2018-09-13 15:48:2915-16赛季CBA联赛之新疆
日期:2016-05-07 05:05:3215-16赛季CBA联赛之八一
日期:2016-03-14 12:32:06程序设计版块每日发帖之星
日期:2015-12-12 06:20:00
10 [报告]
发表于 2018-04-11 15:24 |只看该作者
回复 9# 本友会机友会摄友会

linux 下 ps 代码不会火起来的,放心吧  
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP