大家好,请帮我编写一个脚本来执行以下操作:
- 我想打开一个名为 C60_GRM_box.gro 的文本文件(我从下面这个文件中复制了第一行),然后提取下面的第二行 127240;
GRM in vacuum 127240 1GRM C1 1 0.061 0.071 0.000 1GRM C2 2 0.184 0.142 0.000
- 然后,我想从第一步中提取的数字中减去 2800,然后将结果除以 60
我想要做的:(步骤 1 中提取的数字 - 2800)/60 = 结果
- 最后我要打开另一个名为C60_GRM_box.top的txt文件(我已将我想要替换部分的文本文件中的所有数据复制到下面)并用我在步骤2中获得的结果替换一个数字(即G8LE单词旁边的数字,即下面的3000),我已将第二个名为C60_GRM_box.top的文件的所有内容粘贴在下面;
; Include forcefield parameters include "/home/abdelaal/Desktop/GROMACS/C60:TAPC/C60_GRM/41/gromos54a7.ff/forcefield.itp" ; Include topology for GRM include "/home/abdelaal/Desktop/GROMACS/C60:TAPC/C60_GRM/41/GRM.itp" ifdef POSRES include "/home/abdelaal/Desktop/GROMACS/C60:TAPC/C60_GRM/41/posrestr.itp" endif ; Include topology for C60 include "/home/abdelaal/Desktop/GROMACS/C60:TAPC/C60_GRM/41/C60.itp" [ system ] ; Name GRM in vacuum [ molecules ] ; Compound #mols GRM 1 G8LE strong text 3000
我不需要打开步骤 1 和 3 中的文件,如果我可以在不打开文件的情况下完成上述所有操作那就太完美了。
非常感谢
答案1
这个 bash shell 脚本可以执行您想要的操作,但是您可以对其进行调整以更改源/目标功能。
假设source.txt
包含源数据;target.txt
是您想要替换的
# get the 2nd line or source.txt-2800
val=$(expr `head -2 source.txt | tail -1` - 2800)
export val2=$(expr $val / 60)
# replace the result
perl -pi -e 's/(G8LE\s+[^\d]*)\d+/$1$ENV{val2}/g' target.txt