2017-10-23-awk用法

2017-10-23-awk用法

多维数组

awk通过将下标整体看成一个字符串来支持多维数组。本文结合例子介绍awk多维数组的赋值及遍历。

  1. 多维数组

awk通过将下标整体看成一个字符串来支持多维数组,实际上是一维数组,如array[5,6]=7,下标5和6连结成字符串5SUBSEP6(数字5和6被视为字符串),SUBSEP是awk内建的一个变量,默认值是\034(文件分隔符file separator),可见,awk可以支持任意维的数组。

  1. 数组赋值

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 'NR
FNR{…;next}{…}’ file1 file2

next表示下一个命令不被执行

2、当awk处理的文件超过两个时,显然上面那种方法就不适用了。因为读第3个文件或以上时,也满足NR>FNR (NR!=FNR),显然无法区分开来。
所以就要用到更通用的方法了:
(1)ARGIND 当前被处理参数标志: awk ‘ARGIND1{…}ARGIND2{…}ARGIND3{…}… ’ file1 file2 file3 …
(2)ARGV 命令行参数数组: awk 'FILENAME
ARGV[1]{…}FILENAMEARGV[2]{…}FILENAMEARGV[3]{…}…’ file1 file2 file3 …
(3)把文件名直接加入判断: awk ‘FILENAME==“file1”{…}FILENAME==“file2”{…}FILENAME==“file3”{…}…’ file1 file2 file3 …


2017-10-23

posted on 2017-10-23 16:17  nicephil  阅读(147)  评论(0编辑  收藏  举报

导航