假设我有一组这样的数据:
arr[0] = "someText1 (x,y,z) a"
arr[1] = "someText2 (x,y,z) b"
如何使用Bash按字典顺序对此数组进行排序[仅考虑文本]?
答案 0 :(得分:6)
Join on newline,转到sort
。
(IFS=$'\n'; sort <<<"${arr[*]}")
sort <<<"fnord"
只需将字符串"fnord"
作为标准输入发送到sort
;对于笨拙的echo "fnord" | sort
,这是一个Bash方便符号(加上它可以避免额外的过程),同样,sort <<<"${arr[*]}"
将数组提供给sort
。
由于数组粘贴取决于IFS
的值,因此我们将其更改为换行符,以便"${arr[*]}"
将生成换行符分隔列表(默认IFS
会导致条目在要扩展到空格分隔列表的数组中)。为了不永久地更改IFS
,我们在子shell中执行此操作;因此,括号括起来。
Bash manual page相当密集,但它就在那里;或者查看Reference Manual。
答案 1 :(得分:2)
一种方法是实现自己的排序算法; bubble-sort非常简单。
另一种方法是使用外部程序(例如sort
)进行排序。这是一个shell函数,它将数组元素作为参数,并将数组的已排序副本保存到名为$SORTED
的变量中:
function sort_array () {
SORTED=()
local elem
while IFS= read -r -d '' elem ; do
SORTED+=("$elem")
done < <(printf '%s\0' "$@" | sort -z)
}
(注意使用空字节作为分隔符,而不是换行符,以便您的数组元素不受限制。这是通过-d ''
read
\0
选项实现的,printf
在-z
格式字符串中,以及sort
的{{1}}选项。)
可以像这样使用:
arr=('a b c' 'd e f' 'b c d' 'e f g' 'c d e')
printf '%s\n' "${arr[@]}" # prints elements, one per line
sort_array "${arr[@]}"
arr=("${SORTED[@]}")
printf '%s\n' "${arr[@]}" # same as above, but now it's sorted
答案 2 :(得分:0)
此代码位于模块中,但您可以在其他文件array.sh中包含所需的函数以使其完整:
https://github.com/konsolebox/bash-library/blob/master/array/sort.sh
该函数可自定义,如生成元素或索引,并专注于字符串或整数。只是尝试使用它。
有一点,它不依赖于排序等外部二进制文件,也不会导致数据重新解释。