# reverse mapping of keys -> values in given array function reverse_mapping(array, tmp_key, tmp_element, done) { # user shouldn't have passed these, but let's be safe tmp_key = tmp_element = "" for (key in done) delete done[key] for (key in array) { # if we already reversed this pair to avoid a collision, continue if (key in done) continue # if this swap would cause a colision, store those values if (array[key] in array) { tmp_key = array[ key] tmp_element = array[tmp_key] } # reverse the mapping of our current key -> element pair array[array[key]] = key # delete the now old mapping delete array[key] # if we had a collision, reverse those values, too if (tmp_key) { array[tmp_element] = tmp_key done [tmp_key ] tmp_key = "" } } } # example BEGIN { a["b"] = 1 a[1] = "a" a[2] = "b" a[3] = "c" for (k in a) printf("a[%s] = %s\n", k, a[k]) reverse_mapping(a) printf("\n") for (k in a) printf("a[%s] = %s\n", k, a[k]) }
The example shown prints:
a[b] = 1 a[1] = a a[2] = b a[3] = c a[a] = 1 a[b] = 2 a[c] = 3 a[1] = b