gpt4 book ai didi

bash - 如果字符串在同一行中匹配,则基于位置的文本 block 替换

转载 作者:行者123 更新时间:2023-11-29 09:49:15 26 4
gpt4 key购买 nike

我有两套PDB文件(这是标准格式,不能修改)。第一组是这样的:

ATOM     18  C33 Q58 d  91     -25.677   3.886 -30.044  1.00  0.00           C  
ATOM 19 C34 Q58 d 91 -24.704 4.881 -29.447 1.00 0.00 C
ATOM 20 C35 Q58 d 91 -23.382 4.873 -30.182 1.00 0.00 C
ATOM 21 C8 Q58 d 91 -20.295 11.484 -33.616 1.00 0.00 C
ATOM 22 C7 Q58 d 91 -19.198 12.305 -33.381 1.00 0.00 C
ATOM 23 C3 Q58 d 91 -18.213 12.498 -34.383 1.00 0.00 C

第二个是:

HETATM 2686  C7  589 A   1     -19.344  12.177 -33.319  1.00 25.88           C  
HETATM 2687 C8 589 A 1 -20.388 11.319 -33.511 1.00 26.31 C
HETATM 2688 C9 589 A 1 -20.364 10.691 -34.747 1.00 26.14 C
HETATM 2689 C10 589 A 1 -19.402 10.845 -35.729 1.00 26.34 C
HETATM 2690 N11 589 A 1 -21.334 11.123 -32.604 1.00 26.22 N
HETATM 2691 C12 589 A 1 -21.713 9.967 -32.081 1.00 25.65 C

每列由可变数量的空格分隔,以便其内容占据特定的位置范围。

第 7-9 列表示笛卡尔空间中的 x、y、z 坐标。对于所有第 3 列(原子类型)匹配,我想用文件 1 的坐标替换文件 2 的坐标。

例如,在示例中,输出文件 2 将是:

HETATM 2686  C7  589 A   1     -19.198  12.305 -33.381  1.00 25.88           C  
HETATM 2687 C8 589 A 1 -20.295 11.484 -33.616 1.00 26.31 C
HETATM 2688 C9 589 A 1 -20.364 10.691 -34.747 1.00 26.14 C
HETATM 2689 C10 589 A 1 -19.402 10.845 -35.729 1.00 26.34 C
HETATM 2690 N11 589 A 1 -21.334 11.123 -32.604 1.00 26.22 N
HETATM 2691 C12 589 A 1 -21.713 9.967 -32.081 1.00 25.65 C

请注意前两行(原子 C7 和 C8)的坐标是如何变化的。

我试过 awk,但它似乎过于依赖定界符,这在这个例子中并不好。第 3 列(原子类型)始终位于第 14-16 位,而 3 个坐标列跨越 32 到 54。

注意:在某些情况下,某些列可能会被合并。例如,在此示例中,第 5 列和第 6 列合并(这也可能发生在第 1 列和第 2 列中):

HETATM 2804  PG  ANP A1001      23.808  17.953  28.350  1.00 52.23           P  

到目前为止我的解决方案(缓慢,但有效):

while read line ; do
atom=$(echo "$line" | cut -c13-16)
coord=$(grep -i "$atom" ${ligand}_${chain}_dock.tmp | cut -c32-54)
echo "$line" | sed -r "s/^(.{31})(.{23})/\1${coord}/" >> ${ligand}_${chain}_dock.pdb
done < ${ligand}_${chain}_ref.pdb

最佳答案

我可能会选择一个愚蠢的方法来解决它:玩弄 printf 语句。但是它适用于您的示例。

命令:

 awk -F' *' 'NR==FNR{a[$3]=$7;b[$3]=$8;c[$3]=$9;next;}\
{if($3 in a)printf "%s %s %-3s %s %s %3s %11s %7s %7s %5s %s %11s\n",\
$1,$2,$3,$4,$5,$6,a[$3],b[$3],c[$3],$10,$11,$12; else print $0}' file1 file2

用你的例子测试:

kent$  awk -F' *' 'NR==FNR{a[$3]=$7;b[$3]=$8;c[$3]=$9;next;}
{if($3 in a)printf "%s %s %-3s %s %s %3s %11s %7s %7s %5s %s %11s\n",
$1,$2,$3,$4,$5,$6,a[$3],b[$3],c[$3],$10,$11,$12; else print $0}' file1 file2
HETATM 2686 C7 589 A 1 -19.198 12.305 -33.381 1.00 25.88 C
HETATM 2687 C8 589 A 1 -20.295 11.484 -33.616 1.00 26.31 C
HETATM 2688 C9 589 A 1 -20.364 10.691 -34.747 1.00 26.14 C
HETATM 2689 C10 589 A 1 -19.402 10.845 -35.729 1.00 26.34 C
HETATM 2690 N11 589 A 1 -21.334 11.123 -32.604 1.00 26.22 N
HETATM 2691 C12 589 A 1 -21.713 9.967 -32.081 1.00 25.65 C

关于bash - 如果字符串在同一行中匹配,则基于位置的文本 block 替换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8295231/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com