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下付き文字を持たない配列名は以下でのみ使用できます。2つの状況:

  • 関数定義または関数呼び出しのパラメーター。
  • キーワードの後の名前タグ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"

など。

時には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")
}

関連情報