基于数组信息循环遍历文件及其版本

时间:2019-04-02 08:24:13

标签: bash file loops

我的目录中包含很多文件,可以根据文件名将其分组。例如,这里我有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. 对每个填充进行预处理:在其内部添加第一个字符串之前的“ MODEL +一个文件的编号”(因此范围为0到4之间的数字),并在最后一个字符串上添加“ ENDMDL”。 / li>
  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 个答案:

答案 0 :(得分:1)

  

如何将数组“组”中的信息与文件夹中存在的文件进行匹配?

使用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选项,您甚至可以更加精确。