2

假设我有一个这样的数据数组:

arr[0] = "someText1 (x,y,z) a"
arr[1] = "someText2 (x,y,z) b"

如何使用 Bash 按字典顺序对这个数组进行排序[仅考虑文本]?

4

3 回答 3

6

加入换行符,传递给sort.

(IFS=$'\n'; sort <<<"${arr[*]}")

sort <<<"fnord"只需将字符串"fnord"作为标准输入发送到sort; 这是笨拙的 Bash 方便表示法echo "fnord" | sort(加上它避免了额外的过程),同样,sort <<<"${arr[*]}"将数组提供给sort.

因为数组粘贴取决于 的值IFS,所以我们将其更改为换行符,这样"${arr[*]}"会产生一个换行符分隔的列表(默认情况下IFS会导致数组中的条目扩展为一个空格分隔的列表)。为了不IFS永久更改,我们在子shell中执行此操作;因此,括号。

Bash 手册页相当密集,但都在那里;或参见参考手册

于 2013-09-02T20:26:06.750 回答
2

一种方法是实现自己的排序算法;冒泡排序非常简单。

另一种方法是使用外部程序,例如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-zsort

它可以这样使用:

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
于 2013-09-02T20:20:43.537 回答
0

此代码在模块中,但您可以只包含其他文件array.sh中所需的函数以使其完整:

https://github.com/konsolebox/bash-library/blob/master/array/sort.sh

该函数是可定制的,例如生成元素或索引,并专门处理字符串或整数。只是尝试使用它。

还有一件事,它不依赖于像排序这样的外部二进制文件,也不会导致可能的数据重新解释。

于 2013-09-02T20:24:03.430 回答