我已经运行了一个程序来生成具有不同参数的结果R,C并且RP反映在输出文件的目录名中,全部都是命名的results.txt.
例如,在目录名params_R_7_C_16_RP_0的7是参数的值R,16是参数的值C,并0为参数的值RP.
我想获取results.txt当前目录树中的所有文件,按嵌入的值排序R,C并RP在其托管目录中.
我首先使用以下命令来获取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)
但我真正想要的是选择性的数字排序:首先是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
...
Run Code Online (Sandbox Code Playgroud)
我params_R_005_C_004_RP_0在生成路径列表时考虑填充嵌入的数字(例如),但这需要一个额外的处理步骤,我想避免.
可以直接实现所需的分类吗?
你需要-V旗帜sort
find ./ -name "results.txt" | sort -V
Run Code Online (Sandbox Code Playgroud)
如果您使用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,C和RP的值.-k与单数-例如,-k3-将代替导致排序从字段3 通过行的剩余部分).