Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How do I sort file paths based on multiple embedded numbers?

Tags:

bash

sorting

I have run a program to generate results with different parameters, R, C and RP, reflected in the directory name of the output files, all named results.txt.

For instance, in directory name params_R_7_C_16_RP_0, the 7 is the value of parameter R, 16 is the value of parameter C and 0 is the value of parameter RP.

I want to get all results.txt files in the current directory tree, sorted by the embedded values of R,C and RP in their hosting directories.

I first use the following command to get the results.txt files that I want to parse:

find ./ -name "results.txt"

and the output is:

./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 

and I tried the following sort command:

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

which results in lexical sorting:

./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

But what I actually want is selective numerical sorting: first by R value, then C, then 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
...

I considered padding the embedded numbers (e.g., params_R_005_C_004_RP_0) when generating the paths list, but that would require an additional processing step, which I want to avoid.

Can the desired sorting be achieved directly?

like image 644
mining Avatar asked Mar 21 '26 09:03

mining


1 Answers

You need the -V flag for sort

find ./ -name "results.txt" | sort -V
like image 98
Fabricator Avatar answered Mar 22 '26 23:03

Fabricator



Donate For Us

If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!