fichiers cat dans un ordre spécifique en fonction du nombre dans le nom de fichier

12

Je les fichiers nommés file.88_0.pdb, file.88_1.pdb, ..., file.88_100.pdb. Je veux qu’ils catsoient file.88_1.pdbcollés après file.88_0.pdb, file.88_2.pdbaprès file.88_1.pdb, etc. Si je le fais cat file.88_*.pdb > all.pdb, les fichiers sont rassemblés dans l'ordre suivant:, 0 1 10 11 12 13 14 15 16 17 18 19 2 20...etc. Comment puis-je les assembler pour que l'ordre soit 0 1 2 3 4 5 6...?

nitrate de sodium
la source
1
Soit dit en passant, vous pourriez être intéressé par notre nouveau site de bioinformatique si vous travaillez dans le domaine.
terdon

Réponses:

24

Utilisation brace expansion

cat file.88_{0..100}.pdb >>bigfile.pdb

Pour ignorer l'impression des messages d'erreur pour les fichiers inexistants, utilisez:

cat file.88_{0..100}.pdb >>bigfile.pdb 2>/dev/null

Dans le zshshell, vous avez également le (n)qualificatif globbing pour demander un tri numérique (par opposition à la valeur alphabétique par défaut ) pour les globs:

cat file.88_*.pdb(n) >>bigfile.pdb 2>/dev/null
αғsнιη
la source
3
cat $(for((i=0;i<101;i++)); do echo -n "file.88_${i}.pdb "; done)

ou, concernant le commentaire de Jesse_b:

cat $(for((i=0;i<101;i++)); do test -f "file.88_${i}.pdb" && echo -n "file.88_${i}.pdb "; done)
Hauke ​​Laging
la source
3

Dans le shell sans extension d'accolade, vous pouvez utiliser ls+ xargs:

ls -v file.88_*.pdb | xargs cat > all.pdb

ls triera les fichiers par ordre numérique:

-v type naturel de (version) numéros dans le texte.

Alexander Kovalev
la source
2

Essayer:

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

Cela a pu sortles fichiers sur par le -k2deuxième champ ( ) en utilisant _comme séparateur. Ici, vous devez utiliser >>sinon chaque nouveau fichier remplacera le dernier.

jesse_b
la source
Je reçois toujours la mauvaise commande:0 1 10 11 12...
nitrate de sodium
quel os courez-vous? si vous faites sort --versionquoi obtenez-vous? Et vous avez le droit -ndans la commande de tri?
jesse_b
OSX El Capitan,sort (GNU coreutils) 5.93
nitrate de sodium
1
Merci beaucoup d'avoir essayé! L' /dev/nullajout à l'autre réponse était indispensable!
nitrate de sodium
1
Utilisation inutile de la substitution de commandes . Utilisez quelque chose comme à la find ... | sort ... | xargs cat >> $outputplace.
David Foerster