fork download
  1. #. arrays of arrays dynamically generate;
  2. # 配列の配列を動的に生成する手法を検討する
  3. #. Action;
  4. {
  5. aformat();
  6. array_entry(foo, _arexp, _value);
  7. }
  8. #. END;
  9. END {
  10. PROCINFO["sorted_in"] = "@ind_num_asc";
  11. print_array(foo, "foo");
  12. }
  13. #. aformat();表の多次元配列のインデックス群と値を中間処理
  14. function aformat( i) {
  15. _arexp = "";
  16. _value = $NF;
  17. if (NF == 1) print "line:" NR " inappropriate input";
  18. else if (NF == 0);
  19. else {
  20. for (i = 1; i < NF - 1; i++) _arexp = _arexp $(i) "-";
  21. _arexp = _arexp $(NF - 1);
  22. }
  23. }
  24. #. array_entry();動的に多次元配列を作成する
  25. function array_entry(a, arexp, value, step) {
  26. if (!step) {
  27. _dim = 0;
  28. delete _tmp;
  29. _dim = split(arexp, _tmp, /-/);
  30. if (!_dim) return 1; #scalar or null skip
  31. if (_dim == 1) { a[arexp] = value; return 0; }
  32. }
  33. if (step == _dim - 2) {
  34. a[_tmp[_dim - 1]][_tmp[_dim]] = value;
  35. return 0;
  36. }
  37. a[_tmp[step + 1]]["dummy"];
  38. array_entry(a[_tmp[step + 1]], "", value, step + 1);
  39. delete a[_tmp[step + 1]]["dummy"];
  40. }
  41. #. print_array();多次元配列の内容をすべて書き出す
  42. function print_array(a, an, e, i) {
  43. for (i in a)
  44. if (isarray(a[i])) print_array(a[i], an, (e "[" i "]"));
  45. else print an (e "[" i "] = ") a[i];
  46. }
  47.  
Success #stdin #stdout 0s 23464KB
stdin
1 2 3 48
1 2 4 6 667
2 5 8 1 4 7 3 6 9 E S W N N 32000
3 1 0
3
4 6

5 1 2 3 4 5 -128
5 1 2 3 4 5 -127
stdout
line:5 inappropriate input
foo[1][2][3] = 48
foo[1][2][4][6] = 667
foo[2][5][8][1][4][7][3][6][9][E][S][W][N][N] = 32000
foo[3][1] = 0
foo[4] = 6
foo[5][1][2][3][4][5] = -127