我有一些bash循环脚本循环文件并用它们做一些事情
for pdb in ${output}/*.pdb ; do
name=$(basename "$pdb")
echo "I am sending ${name} to some place!"
done
现在我想在循环中引入一些过滤器来传递文件,而不在$ name的任何部分中使用一些关键字,从而排除所有具有已定义关键字的文件。
为了实现我想在数组中设置所有关键字
#For a file with that keywords within the name the script should stop and loop another file etc
declare -a keywords=('apo' 'Apo' 'APO' 'sauf');
#workflow for a signle keyword "apo"
for traj in ${all_trr}/*.xtc; do
traj_name3=${traj##*/[0-9][0-9]_[0-9][0-9]_[0-9][0-9][0-9][0-9].}
if [[ "$traj_name" != *apo* ]]
then
#begins loop from the another file
echo "I am sending ${traj_name} to analysis"
#break
else
echo "I am not sending ${traj_name} to analysis"
continue
fi
done
所以我需要为数组调整这个工作流程:1)比较每个文件名和数组元素3)只有当它与它不匹配时才将它发送到脚本。 例如,我有一个复杂名称的文件,其中关键字出现在不同的部分:
08_29_2017.gromacs_AT1_dry_sauf.1rep.step7_1.pdb
08_29_2017.gromacs_AT1_dry_Apo.1rep.step7_1.pdb
08_29_2017.gromacs_AT1_wat_apo.3rep.step7_1.pdb
08_30_2017.gromacs_AT1_wat_Na.2rep.step7_1.pdb
所以只有
08_30_2017.gromacs_AT1_wat_Na.2rep.step7_1.pdb
应传递给
echo "I am sending ${name} to some place!"
同时如果我的文件只有一个关键字,例如apo
08_29_2017.gromacs_AT1_dry_apo.1rep.step7_1.pdb
08_29_2017.gromacs_AT1_dry_apo.1rep.step7_1.pdb
08_29_2017.gromacs_AT1_wat_apo.3rep.step7_1.pdb
08_30_2017.gromacs_AT1_wat_Na.2rep.step7_1.pdb
也只应处理最后一个文件(但该数组应包含许多10-15个关键字,包括'apo')
答案 0 :(得分:0)
我现有的代码中有一些我不理解的东西:
traj_name3=${traj##*/[0-9]...}
似乎毫无用处。我错过了什么?我会压制它。traj_name3
的变量,但您稍后使用名为traj_name
的变量。错字?*.pdb
个文件名示例,但您的代码会查找*.xtc
。错字?我将假设它是*.pdb
。这是固定的,类似下面的内容应该有效:
declare -a keywords=('apo' 'Apo' 'APO' 'sauf');
for traj in ${all_trr}/*.pdb; do
for keyword in "${keywords[@]}"; do
if [[ "$traj" == *$keyword* ]]; then
echo "I am not sending $traj to analysis"
continue 2 # continue outermost loop
fi
done
echo "I am sending $traj to analysis"
done