【问题标题】:Passing arrays in awk function在 awk 函数中传递数组
【发布时间】:2018-01-24 00:11:39
【问题描述】:

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

 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 

并且在输出中,如果从文件中读取的值存在于任何定义的数组中,则代码应返回该值的位置

输出:

1 1 3
    6
  2 1 

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

【问题讨论】:

  • 是的,这是意料之中的。因为您不能将没有值的任何数组分配给任何其他变量或数组。请在帖子中发布您的示例 Input_file 和预期输出,以便我们可以帮助您。
  • 我看到您已经编辑了您的帖子,请添加更多示例来说明您的要求,以获得帮助。
  • 我想在 awk 中编写和编码,它将从输入文件中读取值并在三个不同的数组 a 、 b 和 c 中返回其索引值。我已经尝试过上面的代码,但我对它没有信心。
  • 好的,请在您的问题中添加适当的示例,以便我们可以帮助您。
  • 您在lenght(arr) 中拼错了length,并且永远不要使用字母l 作为变量名,因为它看起来太像数字1,因此会混淆您的代码。 else continue 什么都不做。

标签: awk


【解决方案1】:

我真的不明白你要做什么(尤其是为什么2 的输入会产生来自a 的索引而不是来自b 的索引,而输入4 会产生相反),但要使用 GNU awk(唯一支持真正多维数组的 awk)从 a[]b[]c[] 创建一个多维数组 arr[][]

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[] 的引用,因此如果a[] 发生更改,则arr[1][] 获胜不。您可能想要做的(同样仅 GNU awk)是将子数组名称存储在 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[])并且只是从@987654343 引用@ 由arr[N] 的内容索引,而不是复制到arr[N][]

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-07-01
    • 1970-01-01
    • 1970-01-01
    • 2018-05-13
    • 1970-01-01
    • 1970-01-01
    • 2017-01-20
    • 1970-01-01
    相关资源
    最近更新 更多