readarray -t array < <(
for str in "${array[@]}"; do
printf '%d\t%s\n' "${#str}" "$str"
done | sort -k 1,1nr -k 2 | cut -f 2- )
Dies liest die Werte des sortierten Arrays aus einer Prozessersetzung.
Die Prozessersetzung enthält eine Schleife. Die Schleife gibt jedes Element des Arrays aus, dem die Länge des Elements und ein Tabulatorzeichen dazwischen vorangestellt sind.
Die Ausgabe der Schleife wird numerisch vom größten zum kleinsten sortiert (und alphabetisch, wenn die Längen gleich sind; -k 2ranstelle von -k 2, um die alphabetische Reihenfolge umzukehren), und das Ergebnis davon wird gesendet, an cutdas die Spalte mit den Zeichenfolgenlängen gelöscht wird.
Sortieren Sie das Testskript, gefolgt von einem Testlauf:
array=(
"tiny string"
"the longest string in the list"
"middle string"
"medium string"
"also a medium string"
"short string"
)
readarray -t array < <(
for str in "${array[@]}"; do
printf '%d\t%s\n' "${#str}" "$str"
done | sort -k 1,1nr -k 2 | cut -f 2- )
printf '%s\n' "${array[@]}"
$ bash script.sh
the longest string in the list
also a medium string
medium string
middle string
short string
tiny string
Dies setzt voraus, dass die Zeichenfolgen keine Zeilenumbrüche enthalten. Auf GNU-Systemen mit einer aktuellen bashVersion können Sie eingebettete Zeilenumbrüche in den Daten unterstützen, indem Sie anstelle von Zeilenumbrüchen das Nullzeichen als Datensatztrennzeichen verwenden:
readarray -d '' -t array < <(
for str in "${array[@]}"; do
printf '%d\t%s\0' "${#str}" "$str"
done | sort -z -k 1,1nr -k 2 | cut -z -f 2- )
Hier werden die Daten mit Nachlauf \0in der Schleife anstelle von Zeilenumbrüchen gedruckt, die sortund cutlesen nicht begrenzte Zeilen durch ihre -zGNU-Optionen und readarraylesen schließlich die nicht begrenzten Daten mit -d ''.