繁体   English   中英

Bash-根据多个字段对文件名进行排序

[英]Bash - sort filenames based on multiple fields

我有一些文件,例如

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对它们进行排序,然后再按record_id对它们进行排序,但没有成功。

ls | sort -t- -k2 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排序的信息?

谢谢!

您可以使用--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/'

对于没有以任何方式进行预排序的数据-一种方法是标签排序,请按标签排序:

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

文件名中有清单。 ls会进行预排序,所以@anubhava的答案对我来说似乎是正确的。 这个例子只是一个附加组件。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM