awk 也提供了定义多维数组的方法。该方法是,将多个下标串成字符串,下标之间用内置变量 SUBSEP 的值(该值为 \\034 ,是一个不可打印字符,极少被使用)分隔。比如 matrix[2, 8] 其实就等效于 matrix[2 SUBSEP 8],转换后得 matrix["2\\0348"] 。一般情况下,也不用去关心这个 SUBSEP 。
假设有下面一个文本(mularray.txt):1 2 3 4 5
6 7 8 9 10
11 22 13 14 15
16 17 18 19 20
21 22 23 24 25
运行下面命令将文本中的各个数读入一个二维数组中,然后依次打印出来。脚本命令写在一个脚本文件中,如下所示:
[Bash shell] 纯文本查看 复制代码 {
nf = NF
for (x = 1; x <= NF; x++) {
matrix[NR, x] = $x
}
}
END { for (x = 1; x <= NR; x++) {
for (y = 1; y <= nf; y++)
printf "%d ", matrix[x,y]
printf "\\n"
}
}
运行输出:# awk -f mularr.awk mularray.txt
1 2 3 4 5
6 7 8 9 10
11 22 13 14 15
16 17 18 19 20
21 22 23 24 25 上面脚本的意思是:
在 END 之前,使用一个 for 循环读入文本中的数值到数组中。其中 NF 为当前记录的字段数,文本中一共有 5 列数字,那么这里 NF 的值就为 5 。NR 表示当前的记录数。for 循环一共进行了 5 次,读入文本顺序是 : 第 1 列数字($1) 读入到 matrix[1,1] (x 等于 1,NR 等于 1)中;第 2 列数字($2)复制到 matrix[2,2] (x 等于 2,NR 等于 2)中,以此类推。
在 END 后,因为是 2 维数组,所以用了两个 for 循环遍历了整个数组。 |