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 2r
anstelle von -k 2
, um die alphabetische Reihenfolge umzukehren), und das Ergebnis davon wird gesendet, an cut
das 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 bash
Version 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 \0
in der Schleife anstelle von Zeilenumbrüchen gedruckt, die sort
und cut
lesen nicht begrenzte Zeilen durch ihre -z
GNU-Optionen und readarray
lesen schließlich die nicht begrenzten Daten mit -d ''
.