linuxbashawk

How to sort the characters of a word using awk?


I can't seem to find any way of sorting a word based on its characters in awk. For example if the word is "hello" then its sorted equivalent is "ehllo". how to achieve this in awk ?


Solution

  • With GNU awk for PROCINFO[], "sorted_in" (see https://www.gnu.org/software/gawk/manual/gawk.html#Controlling-Scanning) and splitting with a null separator resulting in an array of chars:

    $ echo 'hello' |
    awk '
        BEGIN { PROCINFO["sorted_in"]="@val_str_asc" }
        {
            split($1,chars,"")
            word = ""
            for (i in chars) {
                word = word chars[i]
            }
            print word
        }
    '
    ehllo
    

    $ echo 'hello' | awk -v ordr='@val_str_asc' 'BEGIN{PROCINFO["sorted_in"]=ordr} {split($1,chars,""); word=""; for (i in chars) word=word chars[i]; print word}'
    ehllo
    

    $ echo 'hello' | awk -v ordr='@val_str_desc' 'BEGIN{PROCINFO["sorted_in"]=ordr} {split($1,chars,""); word=""; for (i in chars) word=word chars[i]; print word}'
    ollhe