一个非常复杂的循环。有人能帮我吗?

一个非常复杂的循环。有人能帮我吗?

我必须多次执行命令,不时更改输入的两个文件。我认为我必须运行一个循环,可能是一个“for”,但我不知道如何运行。命令如下:

"....." -ps -i xxxx_X.pdb -gl Pocket_nnn_xxxx_X.pdb -o output.txt 

两个输入文件是-i-gl选项之后的文件,它们彼此相关,从某种意义上说,选项的输入文件-i对应于该-gl选项的 N 个文件(它们可以是 1 和 10):相关性由下式给出:姓名。例如,第一个文件可能如下:1crt_A.pdb第二个Pocket_001_1crt_A.pdb...同时可能还有另一个文件Pocket_002_1crt_a.pdb。除了为每个文件迭代命令之外,问题还在于它们都位于同一目录下,但每个文件都位于一个子目录中,该子目录的名称是输入-i文件的名称。例如,我们将有一个名为 的目录ALL,其中将有一个子目录,1crt.A其中将有多个文件,包括上述两个输入文件。此外,每个命令都会生成一个如下所示的输出文件:

Input PDB-File:         1crt_A.pdb
Pocket File:            Pocket_001_1crt_A.pdb
eeeeee:                 405.0  
wwwwwwwwwwwww:          71.7    (17.7%)
rrrrrrrrrrrrr:          221.9   (54.8%)
tttttttttttttttt:       206.7   (51.0%)
yyyyyyyyyyyyyy:         84.4    (20.8%)
AAAAAAAAAAAAAAAAAA:     92.0    (22.7%)
BBBBBBBBBBBBB:          536.6  
cgdfeehhhhh:            458
tyrudioh:               78
serfgg:                 2        15
eeeeeeeeeeee:           5        5

我想提取每个生成的文件输出,第 2 行第 2 列 ( Pocket_001_1crt_A.pdb) 将其复制到新的文本文件 ( ) 并在同一行报告第 8 行 ( ) 和 9 ( ) 列 2 和 3SUMMARY_ALL.txt上存在的信息新的文本文件应如下所示:AAAAABBBBB

                        AAAAAA   AAAAA(%)   BBBBBB
Pocket_001_1crt_A.pdb   92.0     (22.7%)     536.6 

必须对所有生成的输出文件执行最后一个操作,并将感兴趣的部分复制到同一文件 ( SUMMARY_ALL.txt) 上。

例子

这些是典型的文件:

主目录:home/Desktop/Work该目录下work有很多目录,这些目录的名称为XXXX_X(例如:2ert_A, 7rtf_3, 9yhj_B....)。每个目录中都有一个名为 的文件XXXX_X.pdb和一个或多个名为 的文件Pocket_nnn_XXXX_X.pdb

例如: - 其中home/Desktop/Work/2ert_A2ert_A.pdbPocket_001_2ert_A.pdb -home/Desktop/Work/7rtf_3其中有7rtf_3.pdb, Pocket_001_7rtf_3.pdb,Pocket_002_7rtf_3.pdbPocket_003_7rtf_3.pdb

所有目录都一样XXXX_X

对于XXXX_X我想要的每个目录,使用以下命令:

'....' -ps -i xxxx_X.pdb -gl Pocket_nnn_xxxx_X.pdb -o Pocket_nnn_xxxx_X_OUTPUT.txt 

其中文件输入 -i ( XXXX_X.pdb) 始终相同,而文件 -gl ( ) 更改(仅当名为 的Pocket_nnn_XXXX_X.pdb目录中有更多文件时才如此,否则命令行只能应用一次)。XXXX_XPocket_nnn_XXXX_X.pdb

每当应用命令行时,因此对于每个Pocket_nnn_XXXX_X.pdb文件,都会生成一个文件输出 ( Pocket_nnn_xxxx_X_OUTPUT.txt),如下所示:

Input PDB-File:         XXXX_X.pdb
Pocket File:            Pocket_nnn_XXXX_X.pdb
eeeeee:                 405.0  
wwwwwwwwwwwww:          71.7    (17.7%)
rrrrrrrrrrrrr:          221.9   (54.8%)
tttttttttttttttt:       206.7   (51.0%)
yyyyyyyyyyyyyy:         84.4    (20.8%)
AAAAAAAAAAAAAAAAAA:     92.0    (22.7%)
BBBBBBBBBBBBB:          536.6  
cgdfeehhhhh:            458
tyrudioh:               78
serfgg:                 2        15
eeeeeeeeeeee:           5        5

我的目标是最后获得一个文本文件( ),其中包含与每个文件信息SUMMARY_ALL.txt相关的所有行。AAAAAAAPocket_nnn_xxxx_X_OUTPUT.txt

例如,如果我只有两个目录2ert_A7rtf_3那么工作是这样的:

  • 里面home/Desktop/Work/2ert_A2ert_A.pdbPocket_001_2ert_A.pdb

命令行:

'....' -ps -i 2ert_A.pdb -gl Pocket_001_2ert_A.pdb -o Pocket_001_2ert_A_OUTPUT.txt 

文件Pocket_001_2ert_A_OUTPUT.txt

Input PDB-File:         2ert_A.pdb
Pocket File:            Pocket_001_2ert_A.pdb
eeeeee:                 405.0  
wwwwwwwwwwwww:          71.7    (17.7%)
rrrrrrrrrrrrr:          221.9   (54.8%)
tttttttttttttttt:       206.7   (51.0%)
yyyyyyyyyyyyyy:         84.4    (20.8%)
AAAAAAAAAAAAAAAAAA:     92.0    (22.7%)
BBBBBBBBBBBBB:          536.6  
cgdfeehhhhh:            458
tyrudioh:               78
serfgg:                 2        15
eeeeeeeeeeee:           5        5
  • 里面home/Desktop/Work/7rtf_37rtf_3.pdb, Pocket_001_7rtf_3.pdb,Pocket_002_7rtf_3.pdbPocket_003_7rtf_3.pdb

命令行:

'....' -ps -i 7rtf_3.pdb -gl Pocket_001_7rtf_3.pdb -o Pocket_001_7rtf_3_OUTPUT.txt

文件Pocket_001_2ert_A_OUTPUT.txt

Input PDB-File:         7rtf_3.pdb
Pocket File:            Pocket_001_7rtf_3.pdb
eeeeee:                 405.0  
wwwwwwwwwwwww:          71.7    (17.7%)
rrrrrrrrrrrrr:          221.9   (54.8%)
tttttttttttttttt:       206.7   (51.0%)
yyyyyyyyyyyyyy:         84.4    (20.8%)
AAAAAAAAAAAAAAAAAA:     80.0   (10.7%)
BBBBBBBBBBBBB:          536.6  
cgdfeehhhhh:            458
tyrudioh:               78
serfgg:                 2        15
eeeeeeeeeeee:           5        5 

另一个命令行:

'....' -ps -i 7rtf_3.pdb -gl Pocket_002_7rtf_3.pdb -o Pocket_002_7rtf_3_OUTPUT.txt

文件Pocket_002_2ert_A_OUTPUT.txt

Input PDB-File:         7rtf_3.pdb
Pocket File:            Pocket_002_7rtf_3.pdb
eeeeee:                 405.0  
wwwwwwwwwwwww:          71.7    (17.7%)
rrrrrrrrrrrrr:          221.9   (54.8%)
tttttttttttttttt:       206.7   (51.0%)
yyyyyyyyyyyyyy:         84.4    (20.8%)
AAAAAAAAAAAAAAAAAA:     50.0    (1.5%)
BBBBBBBBBBBBB:          536.6  
cgdfeehhhhh:            458
tyrudioh:               78
serfgg:                 2        15
eeeeeeeeeeee:           5        5 

最后一行命令行:

'....' -ps -i 7rtf_3.pdb -gl Pocket_003_7rtf_3.pdb -o Pocket_003_7rtf_3_OUTPUT.txt

文件Pocket_003_2ert_A_OUTPUT.txt

Input PDB-File:         7rtf_3.pdb
Pocket File:            Pocket_003_7rtf_3.pdb
eeeeee:                 405.0  
wwwwwwwwwwwww:          71.7    (17.7%)
rrrrrrrrrrrrr:          221.9   (54.8%)
tttttttttttttttt:       206.7   (51.0%)
yyyyyyyyyyyyyy:         84.4    (20.8%)
AAAAAAAAAAAAAAAAAA:     65.0    (75.7%)
BBBBBBBBBBBBB:          536.6  
cgdfeehhhhh:            458
tyrudioh:               78
serfgg:                 2        15
eeeeeeeeeeee:           5        5 

最后文件ALL_SUMMAY.txt应该是这样的:

Pocket_001_2ert_A.pdb     92.0    (22.7%)
Pocket_001_7rtf_3.pdb     80.0   (10.7%)
Pocket_002_7rtf_3.pdb     50.0    (1.5%)
Pocket_003_7rtf_3.pdb     65.0    (75.7%)

我需要将所有Pocket_nnn_XXXX_X_OUTPUT.txt内容保存在工作目录(XXXX_X)中。该文件ALL_SUMMARY.txt可以保存在该目录中home/Desktop/Work/

答案1

如果我理解你的规范 - 不太清楚不一致 - 正确,你需要两个循环

a) 找到主 .pdb 文件,并且

b) 相关的袖珍文件。

创建(并覆盖旧版本)文件后output.txt,使用awk将所需字段提取到结果文件中。在cded int dir后ALL,尝试

for FN1 in *.pdb                                                                # loop across all .pdb files
  do    PN="${FN1##*/}"
        PN="${PN%.pdb}"                                                         # construct subdir name
        for FN2 in "${PN/_/.}"/*.pdb                                            # 2nd loop across .pdb files in subdir
          do    "....." -ps -i "$FN1" -gl "$FN2" -o output.txt                  # create output.txt in parent dir
                awk -F: 'FNR == 2  ||                                           # extract desired fields
                         /^AAAAA/  ||
                         /^BBBBB/       {sub (/^ */, "", $2)
                                         printf "%20s%s", $2, /^BBBB/?"\n":""
                                        }
                        ' output.txt >> SUMMARY_ALL.txt                         # and append to result file
          done
  done

对结果文件的修饰性更正(如打印标题、行格式)留给读者。

答案2

解决这个问题的想法是

  • cd到基本目录home/Desktop/Work
  • 循环所有目录????_?(循环变量dir
    • 如果有匹配的文件$dir.pdb
      • cd进入目录$dir
      • 循环所有Pocket_*_$dir.pdb
        • 运行命令处理数据并创建相应的输出文件
        • 如果成功将数据从输出文件提取到标准输出
      • 如果需要cd返回父目录
  • 将此循环的输出(即所有提取的数据)放入ALL_SUMMARY.txt
cd home/Desktop/Work
# edit: remove old summary file because now the script will append to it
rm SUMMARY_ALL.txt
for dir in ????_?
do
    if [ -f "$dir/$dir.pdb" ]
    then
        cd "$dir"
        for pocket in Pocket_*_"$dir.pdb"
        do
            out="${pocket%.pdb}_OUTPUT.txt"
            # edit: if the command '....' prints output this will end up in the summary file
            # '....' -ps -i "$dir.pdb" -gl "$pocket" -o "$out" && awk '/Pocket File:/ {pocket=$NF} /AAAAAAAAAAAAAAAAAA:/ {aaa1=$(NF-1);aaa2=$NF} /BBBBBBBBBBBBB:/ {bbb=$NF} END {print pocket,aaa1,aaa2,bbb}' "$out"
            '....' -ps -i "$dir.pdb" -gl "$pocket" -o "$out" && awk '/Pocket File:/ {pocket=$NF} /AAAAAAAAAAAAAAAAAA:/ {aaa1=$(NF-1);aaa2=$NF} /BBBBBBBBBBBBB:/ {bbb=$NF} END {print pocket,aaa1,aaa2,bbb}' "$out" >> ../SUMMARY_ALL.txt
        done
        cd ..
    fi
# edit: avoid putting other output into summanry file
# done > SUMMARY_ALL.txt
done

笔记:

该代码未经测试。

我假设生成输出文件的命令在成功时以状态 0 退出,在错误时以 !=0 退出,以便&&在此命令和awk提取数据的命令之间使用。

awk命令仅适合处理单个文件。 (这里就是这样使用的。)如果您想在一次运行中处理所有输出文件,则需要更改脚本。

相关内容