假设我有一个这样的数据数组:
arr[0] = "someText1 (x,y,z) a"
arr[1] = "someText2 (x,y,z) b"
如何使用 Bash 按字典顺序对这个数组进行排序[仅考虑文本]?
加入换行符,传递给sort
.
(IFS=$'\n'; sort <<<"${arr[*]}")
sort <<<"fnord"
只需将字符串"fnord"
作为标准输入发送到sort
; 这是笨拙的 Bash 方便表示法echo "fnord" | sort
(加上它避免了额外的过程),同样,sort <<<"${arr[*]}"
将数组提供给sort
.
因为数组粘贴取决于 的值IFS
,所以我们将其更改为换行符,这样"${arr[*]}"
会产生一个换行符分隔的列表(默认情况下IFS
会导致数组中的条目扩展为一个空格分隔的列表)。为了不IFS
永久更改,我们在子shell中执行此操作;因此,括号。
一种方法是实现自己的排序算法;冒泡排序非常简单。
另一种方法是使用外部程序,例如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 ''
选项 to read
、格式字符串\0
中的 the和选项 to 来实现的。)printf
-z
sort
它可以这样使用:
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
此代码在模块中,但您可以只包含其他文件array.sh中所需的函数以使其完整:
https://github.com/konsolebox/bash-library/blob/master/array/sort.sh
该函数是可定制的,例如生成元素或索引,并专门处理字符串或整数。只是尝试使用它。
还有一件事,它不依赖于像排序这样的外部二进制文件,也不会导致可能的数据重新解释。