Как я могу динамически назвать переменную в 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
Другие вопросы по тегам