BEGIN { SUBSEP = "#" cmp_level = 0 num_to_a_level = 0 } BEGIN { keys["foo6"] keys["foo10"] keys["\"foo6\""] keys["\"foo10\""] PROCINFO["sorted_in"] = "str_num_cmp" for (k in keys) { print k, keys[k] } } function str_num_cmp(i1, v1, i2, v2, a1, a2) { ++cmp_level printf "enter str_num_cmp, level %d '%s', '%s', '%s', '%s'\n", cmp_level, i1, v1, i2, v2 str_num_to_a(i1, a1) str_num_to_a(i2, a2) if (a1[1] < a2[1]) { printf "exit str_num_cmp, level %d\n", cmp_level --cmp_level return -1 } if (a1[1] == a2[1]) { if (a1[2] < a2[2]) { printf "exit str_num_cmp, level %d\n", cmp_level --cmp_level return -1 } if (a1[2] == a2[2]) { printf "exit str_num_cmp, level %d\n", cmp_level --cmp_level return 0 } } printf "exit str_num_cmp, level %d\n", cmp_level --cmp_level return 1 } function str_num_to_a(i, a) { ++num_to_a_level printf("enter str_num_to_a, level %d, value '%s'\n", num_to_a_level, i) n = match(i, /"([^0-9]*)([0-9]+)"/, a) if (n) { for (x in a) { printf "'%s' -> '%s', '%s'\n", x, a[x], typeof(a[x]) } } else { print "no match" } printf("exit str_num_to_a, level %d\n", num_to_a_level) --num_to_a_level }