如何对多个文件名部分上的文件进行排序?

用户名

我的文件名格式为STR_NUM1_STR_NUM2_NUM3_NUM4_STR.datNUM1对许多文件重复。我想首先基于NUM1NUM1组并在每个NUM1组中对文件进行排序,我希望基于来对文件进行排序NUM4我怎么能在bash中做到这一点?

Tmp1_24298_Data_545_547_63359_Sample.dat
Tmp1_24298_Data_667_669_63637_Sample.dat
Tmp1_24298_Data_683_685_63517_Sample.dat
Tmp1_24298_Data_695_697_63557_Sample.dat
Tmp1_24298_Data_701_703_63437_Sample.dat
Tmp1_28703_Data_545_547_63833_Sample.dat
Tmp1_28703_Data_667_669_64111_Sample.dat
Tmp2_28703_Data_683_685_63951_Sample.dat
Tmp2_28703_Data_695_697_64031_Sample.dat
Tmp2_28703_Data_701_703_63910_Sample.dat
Tmp2_28707_Data_545_547_64306_Sample.dat
Tmp2_28707_Data_667_669_64545_Sample.dat
Tmp2_28707_Data_683_685_64424_Sample.dat
Tmp2_28707_Data_295_697_64505_Sample.dat
Tmp2_28707_Data_701_703_64344_Sample.dat
约翰1024

总而言之,要使用_字段分隔符对第二个和第六个字段中的数字进行排序。在这种情况下,如果文件名位于名为的filenames文件中,则每行一个文件,然后使用:

$ sort -nt_ -k2,2 -k6,6 filenames
Tmp1_24298_Data_545_547_63359_Sample.dat
Tmp1_24298_Data_701_703_63437_Sample.dat
Tmp1_24298_Data_683_685_63517_Sample.dat
Tmp1_24298_Data_695_697_63557_Sample.dat
Tmp1_24298_Data_667_669_63637_Sample.dat
Tmp1_28703_Data_545_547_63833_Sample.dat
Tmp2_28703_Data_701_703_63910_Sample.dat
Tmp2_28703_Data_683_685_63951_Sample.dat
Tmp2_28703_Data_695_697_64031_Sample.dat
Tmp1_28703_Data_667_669_64111_Sample.dat
Tmp2_28707_Data_545_547_64306_Sample.dat
Tmp2_28707_Data_701_703_64344_Sample.dat
Tmp2_28707_Data_683_685_64424_Sample.dat
Tmp2_28707_Data_295_697_64505_Sample.dat
Tmp2_28707_Data_667_669_64545_Sample.dat

如果文件在当前目录中,则POSIX解决方案是:

$ find . -maxdepth 1 -type f -name '*.dat' | sort -nt_ -k2,2 -k6,6
Tmp1_24298_Data_545_547_63359_Sample.dat
Tmp1_24298_Data_701_703_63437_Sample.dat
Tmp1_24298_Data_683_685_63517_Sample.dat
Tmp1_24298_Data_695_697_63557_Sample.dat
Tmp1_24298_Data_667_669_63637_Sample.dat
Tmp1_28703_Data_545_547_63833_Sample.dat
Tmp2_28703_Data_701_703_63910_Sample.dat
Tmp2_28703_Data_683_685_63951_Sample.dat
Tmp2_28703_Data_695_697_64031_Sample.dat
Tmp1_28703_Data_667_669_64111_Sample.dat
Tmp2_28707_Data_545_547_64306_Sample.dat
Tmp2_28707_Data_701_703_64344_Sample.dat
Tmp2_28707_Data_683_685_64424_Sample.dat
Tmp2_28707_Data_295_697_64505_Sample.dat
Tmp2_28707_Data_667_669_64545_Sample.dat

这个怎么运作

  • -n告诉您sort按数字排序。

  • -t_告诉sort使用_的字段分隔符。

  • -k2,2 -k6,6告诉sort您在第二个字段上排序第一,如果第二个字段相等,则在第六个字段上排序。

GNU解决方案(处理包含换行符的文件名)

要处理本身包含换行符的文件名,我们需要使用NUL分隔符。这意味着使用-print0withfind-zwith withsort然后,使输出可打印以在此处显示,可以使用以下命令将NUL转换为换行符tr

$ find . -maxdepth 1 -type f -name '*.dat' -print0 | sort -znt_ -k2,2 -k6,6 | tr '\0' '\n'
./Tmp1_24298_Data_545_547_63359_Sample.dat
./Tmp1_24298_Data_701_703_63437_Sample.dat
./Tmp1_24298_Data_683_685_63517_Sample.dat
./Tmp1_24298_Data_695_697_63557_Sample.dat
./Tmp1_24298_Data_667_669_63637_Sample.dat
./Tmp1_28703_Data_545_547_63833_Sample.dat
./Tmp2_28703_Data_701_703_63910_Sample.dat
./Tmp2_28703_Data_683_685_63951_Sample.dat
./Tmp2_28703_Data_695_697_64031_Sample.dat
./Tmp1_28703_Data_667_669_64111_Sample.dat
./Tmp2_28707_Data_545_547_64306_Sample.dat
./Tmp2_28707_Data_701_703_64344_Sample.dat
./Tmp2_28707_Data_683_685_64424_Sample.dat
./Tmp2_28707_Data_295_697_64505_Sample.dat
./Tmp2_28707_Data_667_669_64545_Sample.dat

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

如何对使用Directoryinfo读取的文件名进行排序

如何在ruby中对文件名进行排序?

如何对包含数字的文件名进行排序

如何递归更改多个文件名的部分?

如何从文件名的多个部分创建目录

如何通过多个文件名进行PHP下载

在Linux上删除多个文件的一部分文件名

如何按部分文件名對流中的文件進行排序?

ls如何排序文件名?

根据python中的文件名对文件进行排序

Bash:根据文件名对文件进行排序

BASH:根据文件名进行文件排序

仅给定文件名,如何按时间对文件列表进行排序

如何以文件名中包含的整数的升序对文件进行排序

如何对文件名中的空格进行排序并连接文件?

如何按文件名对文件路径列表进行排序?

PowerShell重命名多个文件,文件名的特定部分

根据部分文件名打开多个Excel文件

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

Python:根据文件名上指定的日期从文件夹中读取文件并进行排序

如何根据Java中多个路径的文件名对文件进行分组

如何按文件名中的日期对文件排序?

以升序对目录中的文件名进行排序

按数字值对文件名进行排序

grep 对过滤器文件名进行排序

C ++在目录中对文件名进行排序

如何使用python按特定顺序对文件名进行排序

如何按数字顺序和修改的时间顺序对文件名进行排序?

如何使用Go编程语言对文件名进行排序?