archivos cat en orden específico según el número en el nombre del archivo


12

Tengo archivos con el nombre file.88_0.pdb, file.88_1.pdb, ..., file.88_100.pdb. Quiero catque file.88_1.pdbse peguen después file.88_0.pdb, file.88_2.pdbdespués file.88_1.pdb, y así sucesivamente. Si lo hago cat file.88_*.pdb > all.pdb, los archivos se agrupan en el siguiente orden: 0 1 10 11 12 13 14 15 16 17 18 19 2 20...etc. ¿Cómo los reúno para que el orden sea 0 1 2 3 4 5 6...?


1
Por cierto, es posible que esté interesado en nuestro nuevo sitio de Bioinformática si está trabajando en el campo.
terdon

Respuestas:


24

Utilizar brace expansion

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

Para ignorar la impresión de los mensajes de error para archivos inexistentes, use:

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

En el zshshell también tiene el (n)calificador global para solicitar una clasificación numérica (en oposición al valor predeterminado de alfabético ) para los globos:

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)

o, con respecto al comentario de Jesse_b:

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

3

En shell sin expansión de llaves puede usar ls+ xargs:

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

ls ordenará los archivos en orden numérico:

-v tipo natural de (versión) números dentro del texto.


2

Tratar:

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

Esto fue capaz de sortlos archivos en el ( -k2) segundo campo utilizando _como separador. Aquí debe usarlo; de lo >>contrario, cada archivo nuevo sobrescribirá el último.


Todavía consigo el orden equivocado:0 1 10 11 12...
nitrato de sodio

que estas corriendo si haces sort --versionlo que obtienes? ¿Y tienes -nel comando de clasificación correcto?
jesse_b

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

1
Muchas gracias por intentarlo! ¡La /dev/nulladición a la otra respuesta era muy necesaria!
nitrato de sodio

1
Uso inútil de la sustitución de comandos . Use algo como en su find ... | sort ... | xargs cat >> $outputlugar.
David Foerster
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.