Bash - 基于多个字段对文件名进行排序

时间:2015-04-02 16:40:36

标签: linux bash unix

我有一些文件,例如

fa_1_se-1.xml  
fa_1_se-2.xml
fa_1_se-3.xml
fa_1_se-10.xml   
fa_2_se-1.xml  
fa_2_se-2.xml
fa_2_se-12.xml 

其中下划线后面的数字表示person_id,连字符后的数字是record_id。

我试图先按person_id对它们进行排序,然后再按记录_id进行排序。

ls | sort -t- -k2给出了

f_a_1_se-1.xml
f_a_2_se-1.xml
f_a_1_se-10.xml
f_a_2_se-12.xml
f_a_1_se-2.xml
f_a_2_se-2.xml
f_a_1_se-3.xml

如何通过person_id和record_id进行排序?

谢谢!

2 个答案:

答案 0 :(得分:3)

您可以使用--stable选项:

sort --stable -t_ -nk2 file
fa_1_se-1.xml
fa_1_se-2.xml
fa_1_se-3.xml
fa_1_se-10.xml
fa_2_se-1.xml
fa_2_se-2.xml
fa_2_se-12.xml

修改

您也可以尝试:

printf "%s\n" fa* | tr '-' '_' | sort -t_ -nk2 -nk4 | sed 's/_\([^_]*\)$/-\1/'

答案 1 :(得分:1)

对于未以任何方式预先排序的数据 - 一种方法是标签排序,按标签排序:

awk -F '[_-\.]' '{print $2, $4, $0}'  filename | sort -k1n -k2n | awk '{print $3}'

其中filename有一个列表。 ls确实预先判断,所以@anubhava的答案对我来说似乎是正确的。这个例子只是一个附加组件。