Циклы по файлам и их издание на основе информации массива - PullRequest
0 голосов
/ 02 апреля 2019

У меня есть каталог с большим количеством файлов, которые можно группировать по их именам.Например, здесь у меня есть 4 группы по 5 файлов в каждой:

ls - ./
# group 1
NpXynWT_apo_300K_0.pdb
NpXynWT_apo_300K_1.pdb
NpXynWT_apo_300K_2.pdb
NpXynWT_apo_300K_3.pdb
NpXynWT_apo_300K_4.pdb
# group 2
NpXynWT_apo_340K_0.pdb
NpXynWT_apo_340K_1.pdb
NpXynWT_apo_340K_2.pdb
NpXynWT_apo_340K_3.pdb
NpXynWT_apo_340K_4.pdb
# group 3
NpXynWT_com_300K_0.pdb
NpXynWT_com_300K_1.pdb
NpXynWT_com_300K_2.pdb
NpXynWT_com_300K_3.pdb
NpXynWT_com_300K_4.pdb
# group 4
NpXynWT_com_340K_0.pdb
NpXynWT_com_340K_1.pdb
NpXynWT_com_340K_2.pdb
NpXynWT_com_340K_3.pdb
NpXynWT_com_340K_4.pdb

Так что здесь каждый из 5 файлов одной группы отличается суффиксом конца от 0 до 4:

NpXynWT_apo_300K_0 ... NpXynWT_apo_300K_4
NpXynWT_apo_340K_0 ... NpXynWT_apo_340K_4
etc

Мне нужно перебрать все эти 40 файлов и

  1. предварительно обработать каждый файл: добавить в него "МОДЕЛЬ + номер файла" (то есть число в диапазонемежду 0 и 4) перед первой строкой и "ENDMDL" в последней строке.
  2. cat вместе предварительно обработанные файлы одной и той же группы

В итоге,в результате мой скрипт должен создать 4 новых «комбинированных» файла, которые будут состоять из 5 субфайлов из исходного списка.

Для реализации я создал массив групп и зациклил его, предоставив индекс от 0 до 4а также два цикла: 1) предварительная обработка каждого файла;2) CAT предварительно обработанные файлы вместе:

# list of 4 groups
systems=(NpXynWT_apo_300K NpXynWT_apo_340K NpXynWT_com_300K NpXynWT_com_340K)

  # pre-process files
for model in "${systems[@]}"; do  
    i="0"
    while [  $i -lt 5 ]; do
    # EDIT EXISTING FILES
    sed -i "1 i\MODEL $i" "${pdbs}"/"${model}"_"$i"_FA.pdb
    echo "ENDMDL" >> "${pdbs}"/"${model}"_"$i"_FA.pdb
    i=$[$i+1]
    done
done

# cat pre-processed filles
for model in ${systems[@]}; do
    cat "${pdbs}"/"${model}"_[0-4]_FA.pdb > "${output}/${model}.pdb"
done

1 - Можно ли объединить оба цикла?Например, должно ли оно совпадать с

# pre-processing PBDs and it catting
for model in "${systems[@]}"; do  
    ##echo "$model"
    i="0"
    while [  $i -lt 5 ]; do
    k=$[$i+1]
    ## do something with pdb
    sed -i "1 i\MODEL $k" "${pdbs}"/"${model}"_"$i"_FA.pdb
    echo "ENDMDL" >> "${pdbs}"/"${model}"_"$i"_FA.pdb
    #gedit "${pdbs}"/"${model}"_"$i"_FA.pdb
    i=$[$i+1]
    done
    # now we cat together the post-processed files
    cat "${pdbs}"/"${model}"_[0-4]_FA.pdb > "${output}/${model}.pdb"
done 

2 - возможно ли упростить две операции из первого цикла редактирования файла?

sed -i "1 i\MODEL $i" "${pdbs}"/"${model}"_"$i"_FA.pdb
echo "ENDMDL" >> "${pdbs}"/"${model}"_"$i"_FA.pdb

1 Ответ

1 голос
/ 02 апреля 2019

как сопоставить информацию из массива "группы" с файлами в папке?

Используйте find. Это там, чтобы найти файлы.

groups=(NpXynWT_apo_300K NpXynWT_apo_340K NpXynWT_com_300K NpXynWT_com_340K) 
for group in ${groups[@]}; do
    find . -name "${group}_*.pdb" -type f
done

Вы можете быть еще точнее, используя -regex и аналогичные find опции.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...