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

6

Eu tenho arquivos chamados file.88_0.pdb , file.88_1.pdb , ... , file.88_100.pdb . Eu quero cat deles para que file.88_1.pdb seja colado depois de file.88_0.pdb , file.88_2.pdb após file.88_1.pdb e assim por diante. Se eu fizer cat file.88_*.pdb > all.pdb , os arquivos serão reunidos na seguinte ordem: 0 1 10 11 12 13 14 15 16 17 18 19 2 20... , etc. Como eu os coloco juntos para que o pedido seja 0 1 2 3 4 5 6... ?

    
por sodiumnitrate 11.08.2017 / 03:08

3 respostas

16

Use 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 shell zsh , você também tem o qualificador% glob_de_gerenciamento para solicitar uma classificação numérica (ao contrário do padrão alfabético ) para globs:

cat file.88_*.pdb(n) >>bigfile.pdb 2>/dev/null
    
por 11.08.2017 / 03:44
3
cat $(for((i=0;i<101;i++)); do echo -n "file.88_${i}.pdb "; done)

ou, em 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)
    
por 11.08.2017 / 03:47
2

Tente:

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 capaz de sort dos arquivos no segundo campo ( -k2 ) usando _ como separador. Aqui você tem que usar >> caso contrário, cada novo arquivo irá sobrescrever o último.

    
por 11.08.2017 / 03:16