对混合数据数组进行排序

时间:2013-09-02 20:03:00

标签: arrays bash

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

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

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

3 个答案:

答案 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

该函数可自定义,如生成元素或索引,并专注于字符串或整数。只是尝试使用它。

有一点,它不依赖于排序等外部二进制文件,也不会导致数据重新解释。