Arrays 对循环文件应用预定义筛选器

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

我有一些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”)

对于您现有的代码,有几点我不理解:

  • 您的模式替换
    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
    

    正如您知道如何对单个关键字执行此操作一样,是什么阻止您在数组的所有元素上循环?我尝试在该循环之外引入另一个循环-循环数组元素,并将其与文件名进行比较(在匹配时中断循环),但它不是非常准确。因此,我非常感谢这个例子,因为您知道如何对一个关键字执行此操作,是什么阻止您在数组的所有元素上循环?我尝试在这个循环之外引入另一个循环-循环数组元素,并将其与文件名进行比较(在匹配时中断循环),但它不是非常准确。因此,我将非常感谢这个例子