CAT файлы в определенном порядке на основе числа в имени файла


12

У меня есть файлы с именем file.88_0.pdb, file.88_1.pdb, ..., file.88_100.pdb. Я хочу, чтобы catони file.88_1.pdbвставлялись после file.88_0.pdb, file.88_2.pdbпосле file.88_1.pdbи так далее. Если я это сделаю cat file.88_*.pdb > all.pdb, файлы будут собраны в следующем порядке: 0 1 10 11 12 13 14 15 16 17 18 19 2 20...и т. Д. Как мне их собрать, чтобы порядок был 0 1 2 3 4 5 6...?


1
Кстати, вас может заинтересовать наш новый сайт по биоинформатике, если вы работаете в этой области.
Тердон

Ответы:


24

использование brace expansion

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

Чтобы игнорировать печать сообщений об ошибках для несуществующих файлов, используйте:

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

В zshоболочке также есть спецификатор globbing (n)для запроса числовой сортировки (в отличие от алфавитного по умолчанию ) для глобусов:

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)

или, относительно комментария Jesse_b:

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

3

В shell без расширения скобки вы можете использовать ls+ xargs:

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

ls отсортирует файлы в числовом порядке:

-v естественный вид (версии) чисел в тексте.


2

Пытаться:

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

Это было возможно для sortфайлов по -k2второму полю ( ) с использованием _в качестве разделителя. Здесь вы должны использовать >>иначе, каждый новый файл будет перезаписывать последний.


Я все еще получаю неправильный заказ:0 1 10 11 12...
нитрат натрия

по какой ОС ты бежишь? если ты делаешь sort --versionто, что получаешь? И у вас есть -nв команде сортировки правильно?
jesse_b

OSX El Capitan,sort (GNU coreutils) 5.93
нитрат натрия

1
Большое спасибо за попытку! /dev/nullДополнение к другому ответу было очень нужно!
нитрат натрия

1
Бесполезное использование подстановки команд . Используйте что-то вроде find ... | sort ... | xargs cat >> $outputэтого.
Дэвид Фёрстер
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.