在我的理解中,awk 数组类似于 python 字典。
所以我写下下面的代码来探索它:
awk '{my_dict[$1] = $2} END { print my_dict}' zen
我得到了:awk: can't read value of my_dict; it's an array name.
由于第一列不是数字,我如何读取数组的全部内容或遍历它?
答案1
您可以循环数组的键并提取相应的值:
awk '{my_dict[$1] = $2} END { for (key in my_dict) { print my_dict[key] } }' zen
要获得与 Python 字典类似的输出,您也可以打印密钥:
awk '{my_dict[$1] = $2} END { for (key in my_dict) { print key ": " my_dict[key] } }' zen
无论密钥类型如何,这都有效。
答案2
这将循环遍历数组:
END { for (i in my_dict) print my_dict[i] }
i
是索引。
答案3
中的数组awk
不是像字典中的一流对象Python
。在 中awk
,不带下标的数组名只能用在两个上下文:
- 函数定义或函数调用中的参数。
- 关键字后的名称标记
in
。
在其他情况下,awk
会引发错误。
您需要一个for
循环来迭代并打印数组的内容:
$ echo 1 2 | awk '{my_dict[$1] = $2};END {for(i in my_dict) print my_dict[i]}'
2
答案4
GNU AWK 使用多维关联数组,例如:
family[me][father][grandpa][name]="George"
family[me][father][grandpa][age]=70
family[me][father][grandma][name]="Katherine"
family[me][father][name]="Vasiliy"
family[me][name]="Ivan"
ETC。
有时很难探索 awk 数组,例如信息处理系统(因为除了标量之外它还有子数组:精液&身份标识)
所以我自己写了这个 awk 脚本。也许它对你有用。您可以删除此类子字符串:\033[1;31m
如果您不喜欢/有彩色输出。
#!/usr/bin/gawk -f
function arraytree(inputarray,arrname,i,member,arrnum){
if(!isarray(inputarray)){
print indent arrname member "[\033[1;31m" i "\033[0m]=\"\033[1;32m" inputarray"\033[0m\""
}else{
arrnum=i
member=i?member "[" i "]":""
print indent (i? arrname member:arrname)"(\033[1;34m" length(inputarray) " member"(length(inputarray)>1?"s":"")"\033[0m)"
indent=indent " "
for(i in inputarray){
arraytree(inputarray[i],arrname,i,member,arrnum)}
indent=substr(indent,1,length(indent)-1)
}
}
BEGIN{
arraytree(ArrayName,"ArrayName")
}