如何在awk中动态命名变量?

时间:2017-12-14 20:37:47

标签: shell unix awk nawk awk-formatting

我要求首先" n"行(" n"在运行时传递的变量)应存储在" n"对应的数组,数组名称命名为arrayRow"NR";这里,NR是内置的awk变量。

awk -F"," -v n=$Header_Count 'NR<=n{
split($0,**("arrayRow" NR)**) }' SampleText.txt

所以第一行应该存储在数组arrayRow1中;第二行应该存储在arrayRow2,...等等。关于如何在awk中创建动态数组名称的任何想法?

1 个答案:

答案 0 :(得分:2)

如果没有hacky shell循环和让shell变量扩展成为awk命令的一部分的错误编码实践,或者在给定数字arg或类似命令的情况下填充硬编码的预定义数组的函数,则不能这样做。不要尝试。

如果你有或者可以获得GNU awk,你应该使用真正的多维数组:

$ cat file
a b c
d e
f g h
i j k
l m

$ awk -v n=3 '
NR<=n {arrayRow[NR][1]; split($0,arrayRow[NR]) }
END {
    for (i in arrayRow)  {
        for (j in arrayRow[i]) {
            print i, j, arrayRow[i][j]
        }
    }
}
' file
1 1 a
1 2 b
1 3 c
2 1 d
2 2 e
3 1 f
3 2 g
3 3 h

否则你可以在任何awk中使用伪多维数组:

$ awk -v n=3 '
NR<=n { for (i=1;i<=NF;i++) arrayRow[NR,i] = $i; nf[NR]=NF }
END {
    for (i in nf) {
        for (j=1; j<=nf[i]; j++) {
            print i, j, arrayRow[i,j]
        }
    }
}
' file

但实际上根本不需要多维数组,只需使用1维并在需要时将字符串拆分为新数组:

$ awk -v n=3 '
NR<=n {arrayRow[NR] = $0}
END {
    for (i in arrayRow)  {
        split(arrayRow[i],arrayRowI)
        for (j in arrayRowI) {
            print i, j, arrayRowI[j]
        }
    }
}
' file