arquivos cat em ordem específica com base no número no nome do arquivo

12

Tenho arquivos nomeados file.88_0.pdb, file.88_1.pdb, ..., file.88_100.pdb. Eu quero que cateles file.88_1.pdbcolem depois file.88_0.pdb, file.88_2.pdbdepois file.88_1.pdbe assim por diante. Se sim cat file.88_*.pdb > all.pdb, os arquivos são reunidos na seguinte ordem:, 0 1 10 11 12 13 14 15 16 17 18 19 2 20...etc. Como os reunimos para que a ordem seja 0 1 2 3 4 5 6...?

nitrato de sódio
fonte
1
A propósito, você pode estar interessado em nosso novo site de Bioinformática, se estiver trabalhando em campo.
terdon

Respostas:

24

Usar brace expansion

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

Para ignorar a impressão das mensagens de erro para arquivos inexistentes, use:

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

No zshshell, você também tem o (n)qualificador de globbing para solicitar uma classificação numérica (em oposição ao padrão alfabético ) para globs:

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

ou, com relação ao comentário 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
fonte
3

No shell sem expansão de chaves, você pode usar ls+ xargs:

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

ls classificará os arquivos em ordem numérica:

-v tipo natural de (versão) números dentro do texto.

Alexander Kovalev
fonte
2

Tentar:

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

Isso foi possível para sortos arquivos no -k2segundo campo ( ) usando _como separador. Aqui você tem que usar, >>caso contrário, cada novo arquivo substituirá o último.

jesse_b
fonte
Ainda recebo a ordem errada:0 1 10 11 12...
sodiumnitrate 11/08/19
o que você está executando? se você faz sort --versiono que recebe? E você tem o -ncomando de ordenação certo?
jesse_b
OSX El Capitan,sort (GNU coreutils) 5.93
nitrato de sódio 11/08
1
Muito obrigado por tentar! A /dev/nulladição à outra resposta era muito necessária!
nitrato de sódio
1
Uso inútil da substituição de comandos . Use algo como em find ... | sort ... | xargs cat >> $outputvez disso.
precisa