我必须多次执行命令,不时更改输入的两个文件。我认为我必须运行一个循环,可能是一个“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
上存在的信息新的文本文件应如下所示:AAAAA
BBBBB
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_A
有2ert_A.pdb
和Pocket_001_2ert_A.pdb
-home/Desktop/Work/7rtf_3
其中有7rtf_3.pdb
, Pocket_001_7rtf_3.pdb
,Pocket_002_7rtf_3.pdb
和Pocket_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_X
Pocket_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
相关的所有行。AAAAAAA
Pocket_nnn_xxxx_X_OUTPUT.txt
例如,如果我只有两个目录2ert_A
,7rtf_3
那么工作是这样的:
- 里面
home/Desktop/Work/2ert_A
有2ert_A.pdb
和Pocket_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_3
有7rtf_3.pdb
,Pocket_001_7rtf_3.pdb
,Pocket_002_7rtf_3.pdb
和Pocket_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
将所需字段提取到结果文件中。在cd
ed 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
命令仅适合处理单个文件。 (这里就是这样使用的。)如果您想在一次运行中处理所有输出文件,则需要更改脚本。