file cat in ordine specifico in base al numero nel nome file


12

Ho file denominati file.88_0.pdb, file.88_1.pdb, ..., file.88_100.pdb. catLi voglio in modo che file.88_1.pdbvengano incollati dopo file.88_0.pdb, file.88_2.pdbdopo file.88_1.pdbe così via. In tal caso cat file.88_*.pdb > all.pdb, i file vengono riuniti nel seguente ordine:, 0 1 10 11 12 13 14 15 16 17 18 19 2 20...ecc. Come li metto insieme in modo che l'ordine sia 0 1 2 3 4 5 6...?


1
A proposito, potresti essere interessato al nostro nuovo sito di Bioinformatica se lavori sul campo.
terdon

Risposte:


24

Uso brace expansion

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

Per ignorare la stampa dei messaggi di errore per i file inesistenti utilizzare:

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

Nella zshshell hai anche il (n)qualificatore globbing per richiedere un ordinamento numerico (al contrario del default alfabetico ) per globs:

cat file.88_*.pdb(n) >>bigfile.pdb 2>/dev/null

3
cat $(for((i=0;i<101;i++)); do echo -n "file.88_${i}.pdb "; done)

oppure, per quanto riguarda il commento di Jesse_b:

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

3

In shell senza espansione parentesi puoi usare ls+ xargs:

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

Ordina i file in ordine numerico:

-v ordinamento naturale di numeri (versione) all'interno del testo.


2

Provare:

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

Questo è stato in grado di accedere ai sortfile dal -k2secondo campo ( ) usando _come separatore. Qui devi usare >>altrimenti ogni nuovo file sovrascriverà l'ultimo.


Ho ancora un ordine sbagliato:0 1 10 11 12...
nitrato di sodio

che sistema operativo stai eseguendo? se fai sort --versioncosa ottieni? E hai -nil comando in sort giusto?
jesse_b,

OSX El Capitan,sort (GNU coreutils) 5.93
nitrato di sodio

1
Grazie mille per averci provato! L' /dev/nullaggiunta all'altra risposta era molto necessaria!
nitrato di sodio

1
Uso inutile della sostituzione dei comandi . Usa find ... | sort ... | xargs cat >> $outputinvece qualcosa di simile .
David Foerster,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.