我有兩組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
當字段3不匹配時,你想要做什麼? – Sorpigal
什麼都沒有。只要保持原來的座標。但是,應該始終有一場比賽。請記住,第1列可以合併到第2列,第4列可以合併到第5列的某些文件中。 – mirix
每個字段的確切寬度將會有所幫助。 – Sorpigal