Как я могу динамически назвать переменную в awk?
У меня есть требование, чтобы первые строки "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 ответ
Вы не можете сделать это без хакерского цикла оболочки и плохой практики кодирования, позволяющей переменным оболочки расширяться, чтобы стать частью команды awk, или функции, которая заполняет жестко запрограммированные предварительно определенные массивы с числовым аргументом или подобным. Даже не пытайся.
Если у вас есть или вы можете получить 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