我正在尝试使用以下脚本将pdbqt-flexible文件合并为一个pdb:
http://prosciens.com/prosciens/oldproscienssarl/files/flexrigidpdbqt2pdb_template.sh
问题片段:
首先我们清理模型PDB
grep ATOM ${FLEXPDBQT}_${MODEL}.pdb > ${FLEXPDBQT}_${MODEL}.pdb.tmp
接下来我们创建一个残基列表
cut -c 18-27 ${FLEXPDBQT}_${MODEL}.pdb.tmp > residuelistraw.tmp`
cat residuelistraw.tmp | uniq > residuelist.tmp
然后将模型文件拆分为残基
while read r
do
rns= echo $r | sed 's/ //g'
egrep "[ \t]$r[ \t]" ${FLEXPDBQT}_${MODEL}.pdb.tmp > $rns.pdb.tmp
sed -i 's/'$FLEXPDBQT'_'$MODEL'.pdb.tmp://' $rns.pdb.tmp
当前它在第3步失败,并产生以下错误:
/flexrigidpdbqt2pdb_template.sh: line 133: $ rns.pdb.tmp: ambiguous redirect
sed: -e expression # 1, character 9: unknown option for the `s' command
我尝试使用一些sed替换来修复错误:
rns=`echo "${r/ /}"`
echo $rns
egrep "[ \t]$r[ \t]" ${FLEXPDBQT}_${MODEL}.pdb.tmp > $rns.pdb.tmp
sed -i 's/'$FLEXPDBQT'_'$MODEL'.pdb.tmp://' $rns.pdb.tmp
但是到目前为止,没有任何改变。
我的sed版本是4.4
答案 0 :(得分:2)
sed
,而是来自您的shell。“歧义重定向”错误意味着您的shell根本无法启动您提供的命令,因为它无法执行该命令环境中所请求的重定向。
rns
为空。这是因为rns= echo $r | sed 's/ //g'
根本没有将rns
分配为sed
的输出。取而代之的是,它仅在执行rns
的过程中将名为echo $r
的瞬态环境变量分配为空字符串(其输出发送到{{1 }},并从那里到脚本的stdout。
相反,使用:
sed
...或者效率较低:
rns=${r//[[:space:]]/}
也就是说,始终运行rns=$(sed -e 's/ //g' <<<"$r")
而不是运行... >$file
,以确保不需要的字符串拆分或glob扩展不会使原本有效的重定向不可行。 (并非所有的Shell版本都发生这种情况,但这意味着如果不加引号,则会导致代码的行为无法预测,除非您知道它将与哪个Shell版本一起运行!)。
如果您使用... >"$file"
作为/
命令的分隔符,则您要替换的数据中不得包含任何sed
。如果您不能保证这一点,请使用其他符号代替/
;例如/
正常工作。
答案 1 :(得分:0)
看来,修复该脚本的必要部分是按照您的建议更改rns:
rns=${r//[[:space:]]/}
及其后的输出引用:
sed -i 's/'$FLEXPDBQT'_'$MODEL'.pdb.tmp://' "$rns.pdb.tmp"
但是,下一步出现了其他问题,以前没有显示:
sed '/'"HN ${r}"'/ r '${rns}'.pdb.tmp' ${RIGIDPDBQT}_${LIGNAME}_${MODEL}_apo.pdb > "${RIGIDPDBQT}_${LIGNAME}_${MODEL}_apo.pdb.tmp"
它不产生任何输出(也没有错误),可能是由于sed的另一个问题(我真的不明白)。
这里很难给出一个有效的例子-许多预格式化的txt文件。尽管如此,我提出的问题已解决,谢谢!