如何根据多个嵌入数字对文件路径进行排序?

时间:2014-06-13 02:27:24

标签: bash sorting

我运行了一个程序来生成包含不同参数的结果,RCRP,反映在输出文件的目录名中,全部都是results.txt

例如,在目录名params_R_7_C_16_RP_0中,7是参数R的值,16是参数C和{{的值1}}是参数0的值。

我希望获取当前目录树中的所有RP个文件,并按其托管目录中的results.txtRC的嵌入值进行排序。

我首先使用以下命令获取我要解析的RP文件:

results.txt

,输出为:

find ./ -name "results.txt"

我尝试了以下排序命令:

./params_R_11_C_9_RP_0/results.txt 
./params_R_7_C_9_RP_0/results.txt
./params_R_7_C_4_RP_0/results.txt
./params_R_11_C_16_RP_0/results.txt 
./params_R_9_C_4_RP_0/results.txt
./params_R_5_C_9_RP_0/results.txt 
./params_R_9_C_25_RP_0/results.txt 
./params_R_7_C_16_RP_0/results.txt 
./params_R_5_C_25_RP_0/results.txt 
./params_R_5_C_16_RP_0/results.txt 
./params_R_11_C_4_RP_0/results.txt
./params_R_9_C_16_RP_0/results.txt
./params_R_7_C_25_RP_0/results.txt
./params_R_11_C_25_RP_0/results.txt 
./params_R_5_C_4_RP_0/results.txt 
./params_R_9_C_9_RP_0/results.txt 

导致 lexical 排序:

find ./ -name "results.txt" | sort

但我真正想要的是选择性数字排序:首先是./params_R_11_C_16_RP_0/results.txt ./params_R_11_C_25_RP_0/results.txt ./params_R_11_C_4_RP_0/results.txt ./params_R_11_C_9_RP_0/results.txt ./params_R_5_C_16_RP_0/results.txt ./params_R_5_C_25_RP_0/results.txt ./params_R_5_C_4_RP_0/results.txt ./params_R_5_C_9_RP_0/results.txt ./params_R_7_C_16_RP_0/results.txt ./params_R_7_C_25_RP_0/results.txt ./params_R_7_C_4_RP_0/results.txt ./params_R_7_C_9_RP_0/results.txt ./params_R_9_C_16_RP_0/results.txt ./params_R_9_C_25_RP_0/results.txt ./params_R_9_C_4_RP_0/results.txt ./params_R_9_C_9_RP_0/results.txt 值,然后是R,然后是C

RP

我在生成路径列表时考虑填充嵌入的数字(例如./params_R_5_C_4_RP_0/results.txt ./params_R_5_C_9_RP_0/results.txt ./params_R_5_C_16_RP_0/results.txt ./params_R_5_C_25_RP_0/results.txt ./params_R_7_C_4_RP_0/results.txt ./params_R_7_C_9_RP_0/results.txt ./params_R_7_C_16_RP_0/results.txt ./params_R_7_C_25_RP_0/results.txt ./params_R_9_C_4_RP_0/results.txt ./params_R_9_C_9_RP_0/results.txt ./params_R_9_C_16_RP_0/results.txt ./params_R_9_C_25_RP_0/results.txt ... ),但这需要一个额外的处理步骤,我想避免这样做。

可以直接实现所需的分类吗?

3 个答案:

答案 0 :(得分:6)

-V

需要sort标记
find ./ -name "results.txt" | sort -V

答案 1 :(得分:5)

如果您使用 GNU sort(最近版本足够多)@Fabricator's answer,则基于GNU sort' s {{1} }选项,是迄今为止最简单的解决方案。

否则,请尝试此符合POSIX标准的解决方案

-V
  • find . -name 'results.txt' | sort -n -t _ -k3,3 -k5,5 -k 7,7 指定数字排序
  • -n将输入行拆分为基于分隔符char的字段。 -t _
  • _首先根据字段3,然后是字段5,然后是字段7对输入进行排序,对应-k3,3 -k5,5 -k 7,7RC值。
    (请注意,使用带有单个号码的RP - 例如,-k - 会导致从字段3 中通过剩余部分对进行排序)。

答案 2 :(得分:0)

尝试find ./ -name "results.txt" | sort -k 3 -t _ -n -k 5 -n