Sample Site

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 : }

clone1.jpg

上位次元をマージしながら多次元配列をコピーする

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 : }

clone2.jpg

多次元配列の要素をカウント

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 : }

clone3.jpg