Bash - 对字符串列表进行排序

时间:2018-02-27 11:57:08

标签: bash list sorting

请您告诉我如何用Bash对以下列表(升序A到Z)(或一般列表)进行排序?

我一直在尝试,但仍然无法获得预期的结果:

my_list='a z t b e c'

结果也应该是一个列表,因为我将它用于Select Loop。

my_list='a b c e t z'  

感谢您的帮助!

4 个答案:

答案 0 :(得分:2)

如果您允许使用sort程序(而不是在bash中编写排序算法),答案可能是这样的:

my_list='a z t b e c'
echo "$my_list" | tr ' ' '\n' | sort | tr '\n' ' '

结果:a b c e t z'

答案 1 :(得分:2)

数组更适合存储一系列内容:

list=(a z t b "item with spaces" c)

sorted=()
while IFS= read -rd '' item; do
    sorted+=("$item")
done < <(printf '%s\0' "${list[@]}" | sort -z)

使用bash 4.4,您可以使用readarray -d

list=(a z t b "item with spaces" c)

readarray -td '' sorted < <(printf '%s\0' "${list[@]}" | sort -z)

使用数组创建一个包含select的简单菜单:

select item in "${sorted[@]}"; do
    # do something
done

答案 2 :(得分:1)

使用GNU awk和controling array traversal order with PROCINFO["sorted_in"]

$ echo -n $my_list |
  awk 'BEGIN {
      RS=ORS=" "                            # space as record seaparator
      PROCINFO["sorted_in"]="@val_str_asc"  # array value used as order
  }
  {
      a[NR]=$0                              # hash on NR to a
  }
  END {
      for(i in a)                           # in given order
          print a[i]                        # output values in a
          print "\n"                        # happy ending
  }'
a b c e t z

答案 3 :(得分:1)

您可以使用xargs两次以及内置的sort命令来完成此任务。

$ my_list='a z t b e c'
$ my_list=$(echo $my_list | xargs -n1 | sort | xargs)
$ echo $my_list
a b c e t z