Bash

Bash根據元素長度對數組進行排序?

  • March 28, 2020

給定一個字元串數組,我想根據每個元素的長度對數組進行排序。

例如…

   array=(
   "tiny string"
   "the longest string in the list"
   "middle string"
   "medium string"
   "also a medium string"
   "short string"
   )

應該排序…

   "the longest string in the list"
   "also a medium string"
   "medium string"
   "middle string"
   "short string"
   "tiny string"

(作為獎勵,如果列表按字母順序對相同長度的字元串進行排序,那就太好了。在上面的範例中,即使它們的長度相同,也要先排序。但這不是“硬”要求,如果它過於medium string復雜middle string解決方案)。

如果數組是就地排序(即“數組”被修改)或創建一個新的排序數組是可以的。

如果字元串不包含換行符,則以下內容應該有效。它使用字元串本身作為輔助排序標準,按長度對數組的索引進行排序。

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

indexes=( $(
   for i in "${!array[@]}" ; do
       printf '%s %s %s\n' $i "${#array[i]}" "${array[i]}"
   done | sort -nrk2,2 -rk3 | cut -f1 -d' '
))

for i in "${indexes[@]}" ; do
   sorted+=("${array[i]}")
done

diff <(echo "${expected[@]}") \
    <(echo "${sorted[@]}")

請注意,轉向真正的程式語言可以大大簡化解決方案,例如在 Perl 中,您可以

sort { length $b <=> length $a or $a cmp $b } @array

引用自:https://unix.stackexchange.com/questions/482393