Gawk
可以將字元串用作gaw k中數組的索引嗎?
讓我們看一下這個文件:
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