2017-10-23-awk用法
2017-10-23-awk用法
多维数组
awk通过将下标整体看成一个字符串来支持多维数组。本文结合例子介绍awk多维数组的赋值及遍历。
- 多维数组
awk通过将下标整体看成一个字符串来支持多维数组,实际上是一维数组,如array[5,6]=7,下标5和6连结成字符串5SUBSEP6(数字5和6被视为字符串),SUBSEP是awk内建的一个变量,默认值是\034(文件分隔符file separator),可见,awk可以支持任意维的数组。
- 数组赋值
awk变量无须定义,可直接赋值,举例如下:
打印数组
for (subscript in array) {
split(subscript, a, SUBSEP);
printf “%s\t%s\t%s\n”, a[1], a[2], array[a[1], a[2]]
}
对于数值,还可以这样遍历
for (i=0; i<M; i++) {
for (j=0; j<N; j++) {
print array[i, j]
}
}
函数split用法如下:
split(string, array [, fieldsep [, seps ] ])
将string按fieldsep分割存储在array[1],
array[2], …, 并将分隔符依次存储在seps[1],
sep[2], …, 最后返回被分割的数目。举例如下:
split(“cul-de-sac”, a, “-”, seps)
a[1] = "cul"
a[2] = "de"
a[3] = “sac”
seps[1] = "-"
seps[2] = “-”
函数返回值为3
4. 其他
可以通过以下方法判断一个数组是否存在指定的下标,用于if语句,如下:
(subscript1, subscript2, …) in array
多文件处理
1、当awk读取的文件只有两个的时候,比较常用的有三种方法
(1)awk ‘NR==FNR{…}NR>FNR{…}’ file1 file2
(2)awk ‘NRFNR{…}NR!=FNR{…}’ file1 file2
(3)awk 'NRFNR{…;next}{…}’ file1 file2
next表示下一个命令不被执行
2、当awk处理的文件超过两个时,显然上面那种方法就不适用了。因为读第3个文件或以上时,也满足NR>FNR (NR!=FNR),显然无法区分开来。
所以就要用到更通用的方法了:
(1)ARGIND 当前被处理参数标志: awk ‘ARGIND1{…}ARGIND2{…}ARGIND3{…}… ’ file1 file2 file3 …
(2)ARGV 命令行参数数组: awk 'FILENAMEARGV[1]{…}FILENAMEARGV[2]{…}FILENAMEARGV[3]{…}…’ file1 file2 file3 …
(3)把文件名直接加入判断: awk ‘FILENAME==“file1”{…}FILENAME==“file2”{…}FILENAME==“file3”{…}…’ file1 file2 file3 …
2017-10-23