Gawk

可以將字元串用作gaw k中數組的索引嗎?

  • March 7, 2017

讓我們看一下這個文件:

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

謝謝。

是的,有可能。但是,您的腳本中的問題是您沒有做(我認為)您認為自己正在做的事情。首先,您將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

引用自:https://unix.stackexchange.com/questions/349709