LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
查看: 791|回复: 5

这个awk语句帮助分析一下

[复制链接]
发表于 2006-3-31 09:32:23 | 显示全部楼层 |阅读模式
awk '
FILENAME=="a.txt" {
   a[$1]=$0
}
FILENAME=="b.txt" {
    b[a[$1]]++
}
END {
for(x in b) {
   print x?b[x]" "x:"";
}
}
' a.txt b.txt

问题:1
a[$1]=$0  这里的a[$1]是一个数组吧。我怎么理解,是关联数组,$1做keys?还是其他的付值
问题:2
b[a[$1]]++ 这个b[a[$1]] b在这里起什么作用。
谢谢!
发表于 2006-3-31 11:07:33 | 显示全部楼层
不错。
a[$1]应该是一个数组,用$1做key;不过,如果a.txt很大,不知道会不会有问题?
b也是个数组吧,用来计数;
回复 支持 反对

使用道具 举报

 楼主| 发表于 2006-4-3 10:35:08 | 显示全部楼层
这个awk执行过程如何?
是先执行a.txt的模式和动作以后,在去执行b.txt
还是 读取a.txt的第一行以后,在去读b.txt的内容
做了以下实验:
cat aa
aa
bb
cc
dd
ee
ff
gg

cat bb
11
22
33
44
55
66
77
88
99

# awk 'FILENAME="aa" {a++} {print a}' aa
1
2
3
4
5
6
7
8
9
# awk 'FILENAME=="aa" {a++} {print a " is aa file"} FILENAME=="bb" {b++}{print b}' aa bb
1 is aa file

2 is aa file

3 is aa file

4 is aa file

5 is aa file

6 is aa file

7 is aa file

8 is aa file

9 is aa file

9 is aa file
1
9 is aa file
2
9 is aa file
3
9 is aa file
4
9 is aa file
5
9 is aa file
6
9 is aa file
7
9 is aa file
8
9 is aa file
9
从这个实验可以看出,
(1)如果aa bb文件一起执行的时候,同时执行的;即匹配了aa 第一行读取完毕后,执行bb文件的匹配,可是为什么会显示出空格???
(2)当aa文件执行完毕以后,在开始z++,这个又是如何调用的呢?
(3)当开始执行bb文件读取的时候,为什么还要一直输出aa的最后一个a变量值??
请各位老师帮忙分析一下。谢谢!!!
回复 支持 反对

使用道具 举报

发表于 2006-4-3 22:05:24 | 显示全部楼层
这个问题很有意思
(3)从结果看,因为a一直保持原来的数值,所以就会一直输出;
awk是怎么运行的不是很了解,难道awk 先把第一个文件读完,再做第二个文件?
回复 支持 反对

使用道具 举报

发表于 2006-4-4 08:43:17 | 显示全部楼层
awk是顺序读取输入文件
数组a:
a[aa]=aa
a[bb]=bb
a[cc]=cc
a[dd]=dd
a[ee]=ee
a[ff]=ff
a[gg]=gg

数组b:
b[a[11]]++ 这个是???不明白
b[a[22]]++
... ...
回复 支持 反对

使用道具 举报

 楼主| 发表于 2006-4-4 09:19:31 | 显示全部楼层
这几天,有琢磨了一下
我的理解:
1) awk 匹配的pattern {Action}是awk的固有模式,也可以省略掉pattern这个匹配关系。而我的例子里,Action有2个"{c++}{print c}",故会出现以上的错误。
2)a[$1]是一个数组,也可以叫关联数组吧。$1是数组中的值(开始这里搞的糊涂);而在awk里数组的值是要通过一个变数来读取的,这个变数首先要找到a[idnex]里的所有索引,找到该索引标的后,然后取到里面的值.也就是for (x in b) x就是变数,b就是那个数组名称。
3)awk在这个过程中的执行顺序,先匹配a.txt的 "FILENAME==a.txt"这个模式,然后执行后面的Action,即{a[$1]=$0}...........注意0的出现绝对不会改变a[$1]的数组的值。他只是为后面的b[a[$1]]做铺垫。
4)前面执行匹配以后,在匹配FILENAME=="b.txt",然后执行后面的Action的动作,也就是{b[a[$1]]},而这里a[$1]要被前面定义的$0填充,相当于b[$0]。
5)所有匹配都执行完毕,然后在执行END这个匹配模式,然后执行Action里的输出。
回复 支持 反对

使用道具 举报

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

本版积分规则

快速回复 返回顶部 返回列表