0

我正在尝试使用以下脚本将 pdbqt-flexible 文件合并到一个 pdb 中:

http://prosciens.com/prosciens/oldproscienssarl/files/flexrigidpdbqt2pdb_template.sh

有问题的片段:

让我们合并文件

  1. 首先我们清理模型 PDB

    grep ATOM ${FLEXPDBQT}_${MODEL}.pdb > ${FLEXPDBQT}_${MODEL}.pdb.tmp
    
  2. 接下来我们创建一个残基列表

    cut -c 18-27 ${FLEXPDBQT}_${MODEL}.pdb.tmp > residuelistraw.tmp`
    cat residuelistraw.tmp | uniq > residuelist.tmp
    
  3. 然后我们将模型文件拆分成残差

    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

4

2 回答 2

2

关于“不明确的重定向”错误

“歧义重定向”错误根本不是来自sed,它来自您的外壳。

“不明确的重定向”错误意味着您的 shell 根本无法启动您给它的命令,因为它无法执行作为该命令环境的一部分请求的重定向。

在这种情况下,变量rns为空。

那是因为根本rns= echo $r | sed 's/ //g' 没有指定rns为 的输出sed。相反,它分配一个名为空字符串的瞬态环境变量rns,仅在执行期间echo $r(其输出被发送到sed,并从那里发送到脚本的标准输出)。

相反,使用:

rns=${r//[[:space:]]/}

...或者,效率较低:

rns=$(sed -e 's/ //g' <<<"$r")

为避免在变量不为空的情况下出现同样的错误,请务必引用!

也就是说,不要运行,而是... >$file始终运行... >"$file",以确保不需要的字符串拆分或全局扩展不会使原本有效的重定向不可行。(并非所有 shell 版本都会发生这种情况,但这意味着不引用会导致代码的行为不可预测,除非您知道它将与哪个 shell 版本一起运行!)。


关于“未知选项”错误

如果您将/其用作分隔sed命令部分的符号,则在被替换的数据中不得有任何/s 。如果您不能保证这一点,请使用不同的印记代替/; 例如,s@/foo/bar@/baz/qux@正常工作。

于 2019-10-07T20:11:00.453 回答
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 文件。尽管如此,我问的问题已经解决了,谢谢!

于 2019-10-08T07:53:38.113 回答