在awk函数中传递数组

时间:2018-01-23 13:58:14

标签: awk

我想编写一个接受两个参数的函数,一个是常量值,另一个是数组。该函数找到数组中元素的索引并返回它。我想用多个数组调用这个函数,就像我试过的那样。

 BEGIN{
a[1]=2;
a[2]=4;
a[3]=3;
b[1]=4;
b[2]=2;
b[3]=6;
c[1]=5;
c[2]=1;
c[3]=6;
arr[1]=a;
arr[2]=b;
arr[3]=c
}
function pos(val,ar[])  {
for (m=1;m<=length(ar);m++) { if (val == ar[m] )
     return m;
else continue }
}

{for( k=1;k<=NF;k++) { for(l=1;l<=length(arr);l++) { print "pos=" pos($i,arr[l])}  } }

但我收到了错误:

fatal: attempt to use array `a' in a scalar context

查看代码可以告诉我如何使用awk实现我想要实现的目标。我在这里遇到的挑战是将数组作为元素分配给另一个数组,如同arr[1]=a中一样,并将数组作为参数传递,方法是引用它的索引,如pos($i,arr[l]中所示。我不知道如何在awk中使这些语句在语法和功能上正确。

输入是:

2 4 6 
3 5 6 
1 2 5 

并且在out out中代码应返回从文件中读取的值的位置(如果它存在于任何定义的数组中)

输出:

1 1 3
    6
  2 1 

在数组a b和c中相应元素索引的第一行输出中分别返回。 1是a中的2的索引,1是b中的4的索引,3是c中的6的索引,对于输入文件中即将出现的行,依此类推。

1 个答案:

答案 0 :(得分:2)

我真的不明白你要做的是什么(特别是为什么2的输入从a产生索引而不是b的索引。 4的输入执行相反的操作但是要使用GNU awk(唯一的awk)从arr[][]a[]b[]创建多维数组c[]支持真正的多维数组)将是:

for (i in a) arr[1][i] = a[i]
for (i in b) arr[2][i] = b[i]
for (i in c) arr[3][i] = c[i]

不只是arr[1] = a等。请注意,您要在a[]中存储arr[1][]内容的副本,而不是a[]的引用,所以如果{ {1}}然后更改a[]不会。您可能想要做的事情(仅限GNU awk)将子数组名称存储在arr[1][]中,然后通过内置变量arr[]访问它们(参见手册页),例如:

SYMTAB

$ cat tst.awk
BEGIN{
    split("2 4 3",a)
    split("4 2 6",b)
    split("5 1 6",c)

    arr[1] = "a"
    arr[2] = "b"
    arr[3] = "c"

    prtArr(arr)
}

function prtArr(arr,    i,subArrName) {
    for (i=1; i in arr; i++) {
        subArrName = arr[i]
        printf "arr[%d] -> %s[] =\n", i, subArrName
        prtSubArr(SYMTAB[subArrName])
    }
}

function prtSubArr(subArr,      j) {
    for (j=1; j in subArr; j++) {
        print "\t" subArr[j]
    }
}

现在$ awk -f tst.awk arr[1] -> a[] = 2 4 3 arr[2] -> b[] = 4 2 6 arr[3] -> c[] = 5 1 6 不再是一个多维数组,它只是一个数组名称字符串数组,而arr[]的内容只存储在一个地方(a[])并且仅引用a[]的{​​{1}}内容,而不是复制到SYMTAB[]