cat files in specific order based on number in filename
I have files named file.88_0.pdb
, file.88_1.pdb
, ...
, file.88_100.pdb
. I want to cat
them so that file.88_1.pdb
gets pasted after file.88_0.pdb
, file.88_2.pdb
after file.88_1.pdb
, and so on. If I do cat file.88_*.pdb > all.pdb
, the files are put together in the following order: 0 1 10 11 12 13 14 15 16 17 18 19 2 20...
, etc. How do I put them together so that the order is 0 1 2 3 4 5 6...
?
Try:
filedir="/path/to/files"
output="/path/to/all.pdb"
for file in $(find $filedir -type f -name "file.88_*" | sort -t "_" -k2 -n); do
cat $file >> $output
done
This was able to sort
the files on by the (-k2
) second field using _
as a separator. Here you have to use >>
otherwise each new file will overwrite the last.
Use brace expansion
cat file.88_{0..100}.pdb >>bigfile.pdb
To ignoring printing the error messages for non-existent files use:
cat file.88_{0..100}.pdb >>bigfile.pdb 2>/dev/null
In the zsh
shell also you have the (n)
globbing qualifier to request a numerical sorting (as opposed to the default of alphabetical) for globs:
cat file.88_*.pdb(n) >>bigfile.pdb 2>/dev/null
cat $(for((i=0;i<101;i++)); do echo -n "file.88_${i}.pdb "; done)
or, regarding the comment of Jesse_b:
cat $(for((i=0;i<101;i++)); do test -f "file.88_${i}.pdb" && echo -n "file.88_${i}.pdb "; done)
In shell w/o brace expansion, if you file names don’t contain whitespace, quotes nor backslashes, you can use ls
(assuming the GNU implementation) + xargs
:
ls -v file.88_*.pdb | xargs cat > all.pdb
ls
will sort files in numeric order:
-v
natural sort of (version) numbers within text.