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 2r
yerine -k 2
alfabetik sırasını tersine çevirmek için), ve bir sonuç olduğu gönderilir cut
ki 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 sort
ve cut
bunların içinden nul ayrılmış hatlar okur -z
GNU seçenekleri ve readarray
son olarak nul ayrılmış verileri okur -d ''
.