请您告诉我如何用Bash对以下列表(升序A到Z)(或一般列表)进行排序?
我一直在尝试,但仍然无法获得预期的结果:
my_list='a z t b e c'
结果也应该是一个列表,因为我将它用于Select Loop。
my_list='a b c e t z'
感谢您的帮助!
答案 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