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- )
Bu işlem, işlem dizisinden sıralanan dizinin değerlerini okur.
İşlem ikamesi bir döngü içerir. Döngü, dizinin her bir öğesini, öğenin uzunluğu ve aradaki sekme karakteri ile başlayarak çıkarır.
Döngünün çıkış küçük en büyük sayısal olarak kriteri (alfabetik uzunlukları aynı ise, kullanım olup -k 2ryerine -k 2alfabetik sırasını tersine çevirmek için), ve bir sonuç olduğu gönderilir cutki dize uzunluklarına sahip sütun siler.
Test komut dosyasını ve ardından bir test çalıştırmasını sıralayın:
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
Bu, dizelerin yeni satır içermediğini varsayar. Yakın tarihli GNU sistemlerinde bash, null karakterini yeni satır yerine kayıt ayırıcı olarak kullanarak verilere gömülü yeni satırları destekleyebilirsiniz:
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- )
Burada, veri firar ile basılır \0, yerine yeni satır ilmeğine sortve cutbunların içinden nul ayrılmış hatlar okur -zGNU seçenekleri ve readarrayson olarak nul ayrılmış verileri okur -d ''.