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

min*_*ing 3 sorting bash

我已经运行了一个程序来生成具有不同参数的结果R,C并且RP反映在输出文件的目录名中,全部都是命名的results.txt.

例如,在目录名params_R_7_C_16_RP_07是参数的值R,16是参数的值C,并0为参数的值RP.

我想获取results.txt当前目录树中的所有文件,按嵌入的值排序R,CRP在其托管目录中.

我首先使用以下命令来获取results.txt我要解析的文件:

find ./ -name "results.txt"
Run Code Online (Sandbox Code Playgroud)

输出是:

./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 
Run Code Online (Sandbox Code Playgroud)

我尝试了以下排序命令:

find ./ -name "results.txt" | sort
Run Code Online (Sandbox Code Playgroud)

这导致词法排序:

./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
Run Code Online (Sandbox Code Playgroud)

但我真正想要的是选择性的数字排序:首先是RC,然后是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
...
Run Code Online (Sandbox Code Playgroud)

params_R_005_C_004_RP_0在生成路径列表时考虑填充嵌入的数字(例如),但这需要一个额外的处理步骤,我想避免.

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

Fab*_*tor 6

你需要-V旗帜sort

find ./ -name "results.txt" | sort -V
Run Code Online (Sandbox Code Playgroud)

  • ...顺便说一句,`sort -V`不是POSIX选项,所以不能保证在非GNU系统上可用.可能值得注意的是,如果您的脚本可能需要在其他地方移植. (2认同)

mkl*_*nt0 5

如果您使用GNU sort(最新版本),@ Fabricator的答案,基于GNU sort-V选项,是迄今为止最简单的解决方案.

否则,请尝试这个符合POSIX的解决方案:

 find . -name 'results.txt' | sort -n -t _ -k3,3 -k5,5 -k 7,7
Run Code Online (Sandbox Code Playgroud)
  • -n指定数字排序
  • -t _ 将输入行拆分为基于分隔符char的字段. _
  • -k3,3 -k5,5 -k 7,7第一排序基于字段3,字段然后5,则字段7中的输入,对应于R,CRP的值.
    (请注意,使用-k数-例如,-k3-将代替导致排序字段3 通过行的剩余部分).