免费注册 查看新帖 |

Chinaunix

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

[文本处理] 求助一个awk 的数组原理 [复制链接]

论坛徽章:
0
发表于 2016-07-26 17:29 |显示全部楼层
[root@localhost tmp]# cat 1.txt
120.192.198.48    /default.php    2794    20    9
120.192.198.48    /in/missing.php    15557    1    74
120.192.198.48    /in/missing.php    15557    2
120.196.118.116    /default.php    952    1    2


[root@localhost tmp]# awk '{b=$1" "$2" "$3;a[b]=a[b]?a[b]","$4:" "$4;c[b]=c[b]" "$5}END{for(i in a)print i,a[i],c[i]}' 1.txt
120.192.198.48 /in/missing.php 15557  1,2  74
120.196.118.116 /default.php 952  1  2
120.192.198.48 /default.php 2794  20  9


有没有大侠给我说一下
awk '{b=$1" "$2" "$3;a[b]=a[b]?a[b]","$4:" "$4;c[b]=c[b]" "$5}END{for(i in a)print i,a[i],c[i]}' 1.txt  
的原理? 我真的看了很久 没看明白

a[b]=a[b]?a[b]","$4:" "$4

c[b]=c[b]" "$5

是什么意思?和原理?


a[b]和c[b] 不是空的吗?


论坛徽章:
743
金牛座
日期:2014-02-26 17:49:58水瓶座
日期:2014-02-26 18:10:15白羊座
日期:2014-04-15 19:29:52寅虎
日期:2014-04-17 19:43:21酉鸡
日期:2014-04-19 21:24:10子鼠
日期:2014-04-22 13:55:24卯兔
日期:2014-04-22 14:20:58亥猪
日期:2014-04-22 16:13:09狮子座
日期:2014-05-05 22:31:17摩羯座
日期:2014-05-06 10:32:53处女座
日期:2014-05-12 09:23:11子鼠
日期:2014-05-21 18:21:27
发表于 2016-07-26 17:39 |显示全部楼层
本帖最后由 Herowinter 于 2016-07-26 17:40 编辑

回复 1# txnet

  1. a[b]=a[b]?a[b]","$4:" "$4

  2. a[b]如果不是0或空值, a[b]=a[b]","$4;
  3. 否则a[b]=" "$4
复制代码
具体看这个:
三元操作符

   

论坛徽章:
0
发表于 2016-07-26 17:48 |显示全部楼层
这个原理大约知道  但我不明白 a 这个时候有没有值?

Herowinter 发表于 2016-07-26 17:39
回复 1# txnet 具体看这个:
三元操作符

论坛徽章:
743
金牛座
日期:2014-02-26 17:49:58水瓶座
日期:2014-02-26 18:10:15白羊座
日期:2014-04-15 19:29:52寅虎
日期:2014-04-17 19:43:21酉鸡
日期:2014-04-19 21:24:10子鼠
日期:2014-04-22 13:55:24卯兔
日期:2014-04-22 14:20:58亥猪
日期:2014-04-22 16:13:09狮子座
日期:2014-05-05 22:31:17摩羯座
日期:2014-05-06 10:32:53处女座
日期:2014-05-12 09:23:11子鼠
日期:2014-05-21 18:21:27
发表于 2016-07-26 18:15 |显示全部楼层
本帖最后由 Herowinter 于 2016-07-26 18:17 编辑

回复 3# txnet

  1. awk 数组初值为空值

  2. 执行到第二行的时候,
  3. a["120.192.198.48 /in/missing.php 15557"]是空值,按a[b]=a[b]?a[b]","$4:" "$4,a[b]=" "$4
  4. a["120.192.198.48 /in/missing.php 15557"]=" "$4="  1"

  5. 第三行,
  6. a["120.192.198.48 /in/missing.php 15557"]=" 1",按a[b]=a[b]?a[b]","$4:" "$4,a[b]=a[b]","$4
  7. a["120.192.198.48 /in/missing.php 15557"]=a[b]","$4=" 1" + "," + "2"=" 1,2"(+表示字符串连接,为理解方便,我友情添加的)
复制代码

论坛徽章:
0
发表于 2016-07-26 18:31 |显示全部楼层
原来如此!万分感谢。
Herowinter 发表于 2016-07-26 18:15
回复 3# txnet

论坛徽章:
0
发表于 2016-07-26 19:20 |显示全部楼层
追加一个问题:
[root@localhost tmp]# awk '{b=$1" "$2" "$3;a=a?a","$4:" "$4;c=c" "$5}END{for(i in a)print i,a,c}' 1.txt
120.192.198.48 /in/missing.php 15557  1,2 74
120.196.118.116 /default.php 952  1  2
120.192.198.48 /default.php 2794  20  9
[root@localhost tmp]# awk '{b=$1" "$2" "$3;a=a?a","$4:" "$4;c=" "$5}END{for(i in a)print i,a,c}' 1.txt
120.192.198.48 /in/missing.php 15557  1,2  
120.196.118.116 /default.php 952  1  2
120.192.198.48 /default.php 2794  20  9


c=c" "$5   的这个c  又是什么值?感觉没有用,但真的去掉 还真少了一个数字?



回复 4# Herowinter


   

论坛徽章:
743
金牛座
日期:2014-02-26 17:49:58水瓶座
日期:2014-02-26 18:10:15白羊座
日期:2014-04-15 19:29:52寅虎
日期:2014-04-17 19:43:21酉鸡
日期:2014-04-19 21:24:10子鼠
日期:2014-04-22 13:55:24卯兔
日期:2014-04-22 14:20:58亥猪
日期:2014-04-22 16:13:09狮子座
日期:2014-05-05 22:31:17摩羯座
日期:2014-05-06 10:32:53处女座
日期:2014-05-12 09:23:11子鼠
日期:2014-05-21 18:21:27
发表于 2016-07-26 20:34 |显示全部楼层
本帖最后由 Herowinter 于 2016-07-26 20:34 编辑

回复 6# txnet

  1. 一样的啊,你的原文中是c[b],最原始是空值,
  2. 做到第二行时,赋值为第5列的值"74",第三行时,
  3. 没有第5列,"74"+""="74"
复制代码

论坛徽章:
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
发表于 2016-07-26 23:05 |显示全部楼层
本帖最后由 jason680 于 2016-07-26 23:06 编辑

回复 6# txnet

b => k
i => n

$ awk 'function DBGprint(){print "NR="NR", k=\""k"\", a[k]=\""a[k]"\", c[k]=\""c[k]"\""}{k=$1" "$2" "$3;a[k]=a[k]?a[k]","$4:" "$4;c[k]=c[k]" "$5;DBGprint()}END{print "--- END ---";for(n in a)print n,a[n],c[n]}' 1.txt
NR=1, k="120.192.198.48 /default.php 2794", a[k]=" 20", c[k]=" 9"
NR=2, k="120.192.198.48 /in/missing.php 15557", a[k]=" 1", c[k]=" 74"
NR=3, k="120.192.198.48 /in/missing.php 15557", a[k]=" 1,2", c[k]=" 74 "
NR=4, k="120.196.118.116 /default.php 952", a[k]=" 1", c[k]=" 2"
--- END ---
120.192.198.48 /in/missing.php 15557  1,2  74
120.192.198.48 /default.php 2794  20  9
120.196.118.116 /default.php 952  1  2

论坛徽章:
0
发表于 2016-07-27 11:00 |显示全部楼层
完全明白了,感谢
回复 7# Herowinter


   

论坛徽章:
0
发表于 2016-07-27 11:00 |显示全部楼层
膜拜级别的!太感谢了
回复 8# jason680


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

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP