如何查看awk数组中的所有内容?

如何查看awk数组中的所有内容?

在我的理解中,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")
}

相关内容