字符串可以用作 gawk 数组数组中的索引吗?

字符串可以用作 gawk 数组数组中的索引吗?

我们来看看这个文件:

9=foo 3=bar 84=baz 30=bin 71=bon
9=goo 3=gar 84=gaz 30=gin 71=gon
9=soo 3=sar 84=saz 30=sin 71=son

运行这个 gawk 行:

gawk '
{
    split($0,arr)
    for(i=1;i<=length(arr);i++){
        eq=index(arr[i],"=")
        num=substr(arr[i],eq+1)
        val=substr(arr[i],0,eq-1)
        printf "%s=%s ", num,val
        arr2[i][num] = val
    }
    printf ORS
}
END{
    print "---\n",arr2[2][9]}
' newfile.txt

我期望得到的是goo因为数组的第一个索引是第二行,第二个索引是符号之前的数字=

例子:

arr2[1][3] = bar
arr2[1][71] = bon
arr[3][30] = sin

很快..

谁能告诉我为什么它不起作用以及它是否可能?

gawk 版本 GNU Awk 4.1.1,API:1.1

谢谢。

答案1

对的,这是可能的。然而,你的脚本中的问题是你没有做(我认为)你认为你正在做的事情。首先,您使用i作为第一级数组的索引:

arr2[i][num] = val

这意味着这i将是一个从 1 到数组长度的数字,arr2[i]如果任何行在同一字段中具有相同的字符串值,则该数字将被覆盖。

现在,您得到空行作为输出的原因(我认为这就是您所得到的,您实际上没有说过)是您在数组中使用了错误的顺序。你有:

arr2[i][num] = val

因此,例如:

arr2[1][soo]=9

您似乎期待的是相反的情况:

arr2[1][9]=soo

所以,你需要的是:

arr2[i][value]=num

如果我们还更改数组定义以用NR作主索引而不是num避免冲突,我们会得到:

gawk '
{
    split($0,arr)
    for(i=1;i<=length(arr);i++){
        eq=index(arr[i],"=")
        num=substr(arr[i],eq+1)
        val=substr(arr[i],0,eq-1)
        arr2[NR][val] = num
    }
}
END{
  for(i in arr2){
    for (num in arr2[i]){
      printf "arr2[%s][%s]=%s\n", i, num, arr2[i][num]
    }
  }
}
' newfile.txt
arr2[1][3]=bar
arr2[1][9]=foo
arr2[1][30]=bin
arr2[1][71]=bon
arr2[1][84]=baz
arr2[2][3]=gar
arr2[2][9]=goo
arr2[2][30]=gin
arr2[2][71]=gon
arr2[2][84]=gaz
arr2[3][3]=sar
arr2[3][9]=soo
arr2[3][30]=sin
arr2[3][71]=son
arr2[3][84]=saz

正如您所看到的,arr2[2][9]现在goo正如预期的那样。整个事情有点太复杂了。您可以将其简化为:

$ awk -F'[ =]' '{
                    for(i=1;i<=NF;i+=2){
                        arr2[NR][$(i)]=$(i+1);
                    }
                } END{print  arr2[2][9]}' newfile.txt 
goo

相关内容