Инкрементное использование переменных в скрипте bash при объединении файлов - PullRequest
0 голосов
/ 14 мая 2018

У меня есть 100 файлов .pdb, которые мне нужно объединить в другой файл .pdb. Я использую скрипт bash и команду cat, но не могу написать инкрементную переменную правильно !! Существует один файл T0950-A.pdb и 100 файлов T0950-B_1.pdb с постепенным увеличением нумерации до 100 с использованием последнего числа в имени файла. Вот мой сценарий:

#!/bin/bash

#concatenate pdb A file to 100 pdb B files

COUNTER=0
while [ $COUNTER -lt 101 ]; do
    ./cat T0950-A.pdb T0950-B_[$COUNTER].pdb > Frodock-T0950_[$COUNTER].pdb
    let COUNTER=COUNTER+1
done

Большое спасибо за любую помощь заранее.

1 Ответ

0 голосов
/ 14 мая 2018
for pdbb in T0950-B_*.pdb; do
    cat T0950-A.pdb "$pdbb" >"Frodock-T0950_${pdbb#*_}"
done

Подстановка параметра ${pdbb#*_} превратит строку T0950-B_55.pdb в 55.pdb (удаляет все, вплоть до первого _ символа, включая первый).

Это зависит от существующей PDBB-файлов и не пытается перебирать целые числа.

Если вы хотите только цикл по первым 100 B-файлам PDB, тогда вы можете использовать

for pdbb in T0950-B_{1..100}.pdb; do
    cat T0950-A.pdb "$pdbb" >"Frodock-T0950_${pdbb#*_}"
done

или

for (( i = 1; i <= 100; ++i )); do
    pdbb="T0950-B_$i.pdb"
    cat T0950-A.pdb "$pdbb" >"Frodock-T0950_${pdbb#*_}"
done

, но эти два варианта не гарантируют, что итерированные файлы действительно существуют.


Отвечая на комментарии (есть также файлы с именами, такими как H0957-B.1.pdb).

Да, они не будут восприняты вышеуказанным кодом.Вместо этого вы бы сделали что-то вроде

for pdbb in H0957-B.*.pdb; do
    cat H0957-A.pdb "$pdbb" >"Somename-H0957_${pdbb#*.}"
done
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...