我要求首先" n"行(" n"在运行时传递的变量)应存储在" n"对应的数组,数组名称命名为arrayRow"NR"
;这里,NR
是内置的awk变量。
awk -F"," -v n=$Header_Count 'NR<=n{
split($0,**("arrayRow" NR)**) }' SampleText.txt
所以第一行应该存储在数组arrayRow1
中;第二行应该存储在arrayRow2
,...等等。关于如何在awk中创建动态数组名称的任何想法?
答案 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