GAWK 多次元配列をコピー/上位次元をマージ
ハッシュですが。
clone();
https://unix.stackexchange.com/questions/456315/clone-complex-array-in-awk
process_array();
User's Guide 10.7 Traversing Arrays of Arrays
配列要素のカウント関数を加えました。再帰ですが自前のローカル変数で数えます。
多次元配列をコピーする
1 : #. awk_clone.awk
2 : BEGIN {
3 : a[1] = "foo";
4 : a[2][1] = "bar";
5 : a[2][2] = "baz";
6 : a[3] = "qux";
7 : a[4][1][1] = "quux";
8 : a[4][2] = "corge";
9 :
10 : clone(b, a);
11 :
12 : process_array(b, "b", "do_print", 0);
13 : }
14 : function clone(lhs, rhs, i) {
15 : for (i in rhs) {
16 : if (isarray(rhs[i])) {
17 : lhs[i][1] = "";
18 : delete lhs[i][1];
19 : clone(lhs[i], rhs[i]);
20 : } else
21 : lhs[i] = rhs[i];
22 : }
23 : }
24 : function do_print(name, element) {
25 : printf("%s = %s\n", name, element);
26 : }
27 : function process_array(arr, name, process, do_arrays, i, new_name) {
28 : for (i in arr) {
29 : new_name = (name "[" i "]");
30 : if (isarray(arr[i])) {
31 : if (do_arrays)
32 : @process(new_name, arr[i]);
33 : process_array(arr[i], new_name, process, do_arrays);
34 : } else
35 : @process(new_name, arr[i]);
36 : }
37 : }
上位次元をマージしながら多次元配列をコピーする
1 : #. awk_proc_array.awk
2 : BEGIN {
3 : a[1] = "foo";
4 : a[2][1] = "bar";
5 : a[2][2] = "baz";
6 : a[3] = "qux";
7 : a[4][1][1] = "quux";
8 : a[4][2] = "corge";
9 :
10 : for (i = 1; i < 5; i++) {
11 : meta_ar_init(b, i);
12 : clone(b[i], a);
13 : }
14 :
15 : process_array(b, "b", "do_print", 0);
16 : }
17 : function meta_ar_init(ar, init_num) {
18 : ar[init_num][0] = "";
19 : delete ar[init_num][0];
20 : }
21 : function clone(lhs, rhs, i) {
22 : for (i in rhs) {
23 : if (isarray(rhs[i])) {
24 : lhs[i][1] = "";
25 : delete lhs[i][1];
26 : clone(lhs[i], rhs[i]);
27 : } else
28 : lhs[i] = rhs[i];
29 : }
30 : }
31 : function do_print(name, element) {
32 : printf("%s = %s\n", name, element);
33 : }
34 : function process_array(arr, name, process, do_arrays, i, new_name) {
35 : for (i in arr) {
36 : new_name = (name "[" i "]");
37 : if (isarray(arr[i])) {
38 : if (do_arrays)
39 : @process(new_name, arr[i]);
40 : process_array(arr[i], new_name, process, do_arrays);
41 : } else
42 : @process(new_name, arr[i]);
43 : }
44 : }
多次元配列の要素をカウント
1 : BEGIN {
2 : a[1] = 1;
3 : a[2][1] = 21;
4 : a[2][2] = 22;
5 : a[3] = 3;
6 : a[4][1][1] = 411;
7 : a[4][2] = 42;
8 : a[4][3][2][1] = 256;
9 :
10 : for (i = 0; i < 9; i++) b[i] = i;
11 :
12 : c["foo"]["corge"] = "grault";
13 : c["plugh"]["bar"] = "garply";
14 : c["baz"]["corge"] = "waldo";
15 : c["qux"]["quux"] = "fred";
16 :
17 : print "count_array(x) = " count_array(x);
18 : print "count_array(a) = " count_array(a);
19 : print "count_array(b) = " count_array(b);
20 : print "count_array(c) = " count_array(c);
21 : }
22 : function count_array(arr, n, i) {
23 : for (i in arr)
24 : if (isarray(arr[i])) count_array(arr[i], n);
25 : else n[0]++;
26 : return n[0];
27 : }