在bash中对多列String数组进行排序

时间:2017-04-25 02:54:03

标签: arrays bash shell sorting

我有一个字符串数组:

arr[0]="1 10 2Z6UVU6h"
arr[1]="1 12 7YzF5mFs"
arr[2]="2 36 qRwAiLg7"

我怎么能按第二列排序并使用1st作为平局。

有什么类似于...的东西吗?

sort -k 2,2n -k 1,1 $arr

1 个答案:

答案 0 :(得分:1)

只要任何数组元素中没有换行符,它就是直截了当的:只需将数组printf排序并捕获输出:

mapfile -t sorted < <(printf "%s\n" "${arr[@]}" | sort -k2,2n -k1,1)

(使用进程替换是为了避免mapfile在子shell中运行,这样做没有用,因为目标是在这个shell中设置$sorted的值。)

如果数组元素可能包含换行符,那么您可以使用NUL作为printf中的分隔符和sort(选项-z进行排序),但是您必须使用显式循环替换mapfile,因为mapfile不提供更改行分隔符的选项。 read确实(-d ''会导致read使用NUL作为行分隔符),但它一次只能读取一行。