在BASH中传递数组进行排序

在BASH中传递数组进行排序,bash,shell,unix,Bash,Shell,Unix,假设我有一个由以下行组成的数组: arr[0] = 20160330 asdsa 24 asdsa 3 3000 054217542 30.3.2016 arr[1] = 20140102 asdsadsa 25 asdsadsaa 5 4500 534215365 2.1.2014 arr[2] = 20160306 dsasda 23 dsada 4 3200 537358234 6.3.2016 现在我想按第一列对它们进行排序,并按排序顺序打印它

假设我有一个由以下行组成的数组:

arr[0] = 20160330        asdsa 24 asdsa 3 3000 054217542 30.3.2016
arr[1] = 20140102        asdsadsa 25 asdsadsaa 5 4500 534215365 2.1.2014
arr[2] = 20160306        dsasda 23 dsada 4 3200 537358234 6.3.2016
现在我想按第一列对它们进行排序,并按排序顺序打印它们:

20140102        asdsadsa 25 asdsadsaa 5 4500 534215365 2.1.2014
20160306        dsasda 23 dsada 4 3200 537358234 6.3.2016
20160330        asdsa 24 asdsa 3 3000 054217542 30.3.2016

如何对数组使用排序

如果确定所有数组元素都不包含换行符,请尝试:

$ printf "%s\n" "${arr[@]}" | sort -nk1,1
20140102        asdsadsa 25 asdsadsaa 5 4500 534215365 2.1.2014
20160306        dsasda 23 dsada 4 3200 537358234 6.3.2016
20160330        asdsa 24 asdsa 3 3000 054217542 30.3.2016
排序,然后删除第一个数字 使用cut:

$ printf "%s\n" "${arr[@]}" | sort -nk1,1 | cut -d" " -f2-
       asdsadsa 25 asdsadsaa 5 4500 534215365 2.1.2014
       dsasda 23 dsada 4 3200 537358234 6.3.2016
       asdsa 24 asdsa 3 3000 054217542 30.3.2016
使用sed:

$ printf "%s\n" "${arr[@]}" | sort -nk1,1 | sed 's/[[:digit:]]*[[:space:]]*//'
asdsadsa 25 asdsadsaa 5 4500 534215365 2.1.2014
dsasda 23 dsada 4 3200 537358234 6.3.2016
asdsa 24 asdsa 3 3000 054217542 30.3.2016

您可以将流程替换与
printf
一起使用:

sort -nk1 <(printf "%s\n" "${arr[@]}")

20140102        asdsadsa 25 asdsadsaa 5 4500 534215365 2.1.2014
20160306        dsasda 23 dsada 4 3200 537358234 6.3.2016
20160330        asdsa 24 asdsa 3 3000 054217542 30.3.2016

sort-nk1是否只能剪切第一个数字,以便行的开头为:
asdsadsa 25 asdsadsaa 5 4500 534215365 2.1.2014
,等等。@LamaEu是的,我刚刚添加了两种删除前导数字的方法。嘿,John。这似乎不起作用。`$printf“%s\n”${arr[@]}“sort-nk1,1|cut-d”'-f2-`没有剪切第一列。