Skip to main content
1 of 3
user avatar
user avatar

A hackish? (complex) and fast one line way to sort the array by length
(safe for newlines and sparse arrays):

#!/bin/bash
a=(
    "tiny string"
    "the longest string in the list"
    "middle string"
    "medium string"
    "also a medium string"
    "short string"
)

readarray -td $'\0' sorted < <(
                    for i in "${!array[@]}"
                    do     printf '%s\0' "${array[i]/#/${#array[i]} }";
                    done |
                            sort -bz -k1,1rn -k2 |
                            cut -zd " " -f2-
                    )

printf '%s\n' "${sorted[@]}"

On one line:

readarray -td $'\0' sorted < <( for i in "${!array[@]}"; do printf '%s\0' "${array[i]/#/${#array[i]} }"; done | sort -bz -k1rn -k2 | cut -zd " " -f2- )

On execution

$ ./script
the longest string in the list
also a medium string
medium string
middle string
short string
tiny string
user232326