【发布时间】:2019-08-26 17:01:59
【问题描述】:
在工作目录中,有几个文件根据文件名的结尾后缀分为几组。以下是 4 个组的示例:
# group 1 has 5 files
NpXynWT_apo_300K_1.pdb
NpXynWT_apo_300K_2.pdb
NpXynWT_apo_300K_3.pdb
NpXynWT_apo_300K_4.pdb
NpXynWT_apo_300K_5.pdb
# group 2 has two files
NpXynWT_apo_340K_1.pdb
NpXynWT_apo_340K_2.pdb
# group 3 has 4 files
NpXynWT_com_300K_1.pdb
NpXynWT_com_300K_2.pdb
NpXynWT_com_300K_3.pdb
NpXynWT_com_300K_4.pdb
# group 4 has 1 file
NpXynWT_com_340K_1.pdb
我已经写了一个简单的 bash 工作流来
- 列表项通过 SED 对每个填充物进行预处理:在每个文件中添加一些内容
-
cat将属于属于同一组的预处理文件放在一起
这是我实现工作流的脚本,其中我创建了一个包含组名称的数组,并根据从 1 到 5 的文件索引循环它
# list of 4 groups
systems=(NpXynWT_apo_300K NpXynWT_apo_340K NpXynWT_com_300K NpXynWT_com_340K)
# loop over the groups
for model in "${systems[@]}"; do
# loop over the files inside of each group
for i in {0001..0005}; do
# edit file via SED
sed -i "1 i\This is $i file of the group" "${pdbs}"/"${model}"_"$i"_FA.pdb
done
# after editing cat the pre-processed filles
cat "${pdbs}"/"${model}"_[1-5]_FA.pdb > "${output}/${model}.pdb"
done
改进此脚本的问题: 1) 如何在内部 (while) 循环中添加一些检查条件(例如通过 IF 语句)以考虑仅现有文件?在我的示例中,脚本始终根据其中一个组中的最大数量(这里是第一组中的 5 个文件)循环 5 个文件(每个组)
for i in {0001..0005}; do
我宁愿循环给定组的所有现有文件,并在文件不存在的情况下中断 while 循环(例如,考虑只有 1 个文件的第 4 组)。这是示例,但是无法正常工作
# loop over the groups with the checking of the presence of the file
for model in "${systems[@]}"; do
i="0"
# loop over the files inside of each group
for i in {0001..9999}; do
if [ ! -f "${pdbs}/${model}_00${i}_FA.pdb" ]; then
echo 'File '${pdbs}/${model}_00${i}_FA.pdb' does not exits!'
break
else
# edit file via SED
sed -i "1 i\This is $i file of the group" "${pdbs}"/"${model}"_00"$i"_FA.pdb
i=$[$i+1]
fi
done
done
是否可以从组中循环任意数量的现有填充(而不是仅仅限制给定的例如非常大数量的文件
for i in {0001..9999}; do?
【问题讨论】:
标签: arrays bash loops conditional-statements