awk函数中的传递数组

awk函数中的传递数组,awk,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 =

我想写一个函数,它接受两个参数,一个是常量,另一个是数组。该函数在数组中查找元素的索引并返回它。我想用多个数组调用该函数,正如我所尝试的那样

 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])}  } }
看看代码,谁能告诉我如何使用awk实现我想要实现的目标。我在这里面临的挑战是将和数组作为一个元素分配给另一个数组,如
arr[1]=a
中所示,并通过引用它的索引将数组作为一个参数传递,如
pos($I,arr[l]
。我不知道如何在awk中使这些语句在语法和功能上正确

输入为:

2 4 6 
3 5 6 
1 2 5 
在out put中,如果从文件中读取的值存在于定义的任何数组中,则代码应返回该值的位置

输出:

1 1 3
    6
  2 1 

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

我真的不明白你想做什么(特别是为什么输入
2
会从
a
生成索引,而不是从
b
生成索引,而输入
4
则会产生相反的结果)而是使用GNU awk从
a[]
b[]
c[]
创建多维数组(唯一支持真正多维数组的awk是:

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
等。请注意,您在
arr[1][]
中存储
a[]
内容的副本,而不是对
a[]
的引用,因此如果
a[]
更改,则
arr[1][/code>将不会更改。您可能需要做的是将子数组名称存储在
arr[]
,然后通过内置变量
SYMTAB
(参见手册页)访问它们,例如:


现在
arr[]
不再是一个多维数组,它只是一个数组名称字符串数组,而
a[]
的内容只存储在一个位置(在
a[]
)中,只是从
SYMTAB[]
引用,由
arr[N]
的内容索引,而不是复制到
arr[N][]

我真的不明白你想做什么(特别是为什么输入
2
会从
a
生成索引,而不是从
b
生成索引,而输入
4
则相反),而是从
a[]
b[]创建多维数组使用GNU awk(唯一支持真正多维数组的awk)的
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
等。请注意,您在
arr[1][]
中存储
a[]
内容的副本,而不是对
a[]
的引用,因此如果
a[]
更改,则
arr[1][/code>将不会更改。您可能需要做的是将子数组名称存储在
arr[]
,然后通过内置变量
SYMTAB
(参见手册页)访问它们,例如:


现在
arr[]
不再是一个多维数组,它只是一个数组名称字符串数组,而
a[]
的内容只存储在一个位置(在
a[]
)中,只是从
SYMTAB[]
引用,由
arr[N]
的内容索引,而不是复制到
arr[N][]

是的,这是应该的。因为你不能将没有值的任何数组分配给任何其他变量或数组。请在post中发布你的示例输入文件和预期输出,以便我们可以在相同的方面帮助你。我看到你已经编辑了你的帖子,请添加一些关于你的要求的更多示例,以获得帮助。我想编写和编辑你的帖子e在awk中,它将从输入文件中读取值,并以三种不同的数组a、b和c返回其索引值。我已经尝试了上述代码,但我对此没有信心。好的,请在您的问题中添加适当的示例,以便我们可以在同一方面帮助您。您在
lenght(arr)中拼写错误了
length
不要将字母
l
用作变量名,因为它看起来太像数字
1
,因此会混淆代码。
否则继续
什么都不做。是的,这是预期的。因为您不能将任何数组的值分配给任何其他变量或数组。请发布您的示例输入文件和预期输出我看到你已经编辑了你的文章,请添加更多关于你的要求的例子,以获得帮助。我想用awk编写和编码,从输入文件中读取值,并返回三个不同数组a、b和c中的索引值。我已经尝试了上面的代码,但我没有信心关于它。好的,请在你的问题中添加适当的例子,以便我们可以帮助你。你在
lenght(arr)
中拼写错误
length
,并且永远不要使用字母
l
作为变量名,因为它看起来太像数字
1
,因此混淆了你的代码。
否则继续
将无所作为。
$ 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