Arrays 对循环文件应用预定义筛选器
我有一些bash循环脚本,它循环文件并对它们做一些事情Arrays 对循环文件应用预定义筛选器,arrays,bash,if-statement,Arrays,Bash,If Statement,我有一些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 wit
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”)对于您现有的代码,有几点我不理解:
traj#u name3=${traj##*/[0-9]…}
似乎没有用。我错过什么了吗?我会压制它traj_name 3
的变量,但随后使用了一个名为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
对于您现有的代码,有几点我不理解:
traj#u name3=${traj##*/[0-9]…}
似乎没有用。我错过什么了吗?我会压制它traj_name 3
的变量,但随后使用了一个名为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
正如您知道如何对单个关键字执行此操作一样,是什么阻止您在数组的所有元素上循环?我尝试在该循环之外引入另一个循环-循环数组元素,并将其与文件名进行比较(在匹配时中断循环),但它不是非常准确。因此,我非常感谢这个例子,因为您知道如何对一个关键字执行此操作,是什么阻止您在数组的所有元素上循环?我尝试在这个循环之外引入另一个循环-循环数组元素,并将其与文件名进行比较(在匹配时中断循环),但它不是非常准确。因此,我将非常感谢这个例子