我想编写一个接受两个参数的函数,一个是常量值,另一个是数组。该函数查找数组中元素的索引并返回它。我想使用多个数组调用此函数,如下我所尝试的那样。
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])} } }
Run Code Online (Sandbox Code Playgroud)
但我收到错误:
fatal: attempt to use array `a' in a scalar context
Run Code Online (Sandbox Code Playgroud)
查看代码,任何人都可以告诉我如何使用 awk 实现我想要实现的目标。我在这里面临的挑战是将数组作为元素分配给另一个数组,如在 中arr[1]=a,并通过使用其索引引用该数组作为参数传递该数组,如在 中pos($i,arr[l]。我不知道如何在 awk 中使这些语句在语法和功能上正确。
输入是:
2 4 6
3 5 6
1 2 5
Run Code Online (Sandbox Code Playgroud)
在输出中,如果从文件中读取的值存在于任何定义的数组中,则代码应返回该值的位置
输出:
1 1 3
6
2 1
Run Code Online (Sandbox Code Playgroud)
在输出的第一行中,数组 ab 和 c 中相应元素的索引已分别返回。1 是 a 中 2 的索引,1 是 b 中 4 的索引,3 是 c 中 6 的索引,对于输入文件中即将出现的行,依此类推。
我真的不明白你想要做什么(特别是为什么 的输入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]
Run Code Online (Sandbox Code Playgroud)
不仅仅是 等。请注意,您存储的是inarr[1] = a内容的副本,而不是对 的引用,因此如果发生更改则不会。您可能想要做的(同样仅限 GNU awk)是将子数组名称存储在其中,然后通过内置变量访问它们(请参阅手册页),例如:a[]arr[1][]a[]a[]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]
}
}
Run Code Online (Sandbox Code Playgroud)
。
$ awk -f tst.awk
arr[1] -> a[] =
2
4
3
arr[2] -> b[] =
4
2
6
arr[3] -> c[] =
5
1
6
Run Code Online (Sandbox Code Playgroud)
现在arr[]不再是一个多维数组,它只是一个数组名称字符串的数组,并且 的内容a[]仅存储在 1 个位置(在 中a[]),并且仅从SYMTAB[]由 的内容索引的索引中引用arr[N],而不是复制到 中arr[N][]。