Linux文本:在模式的上一行添加行

时间:2013-11-04 11:47:29

标签: linux file text

我想添加一个特定的行" TER"几个可变文本文件:

输入:

[...]
ATOM   4149  C   LEU C   9     136.820 120.050  53.540  1.00  0.00
ATOM   4150  O   LEU C   9     136.600 118.860  53.240  1.00  0.00
ATOM   4151  O   LEU C   9     137.310 120.340  54.650  1.00  0.00
ATOM   4154  N   LYS D   2     115.050 134.940  61.060  1.00  0.00
ATOM   4155  H1  LYS D   2     115.660 134.160  61.180  1.00  0.00
ATOM   4156  H2  LYS D   2     114.760 135.000  60.100  1.00  0.00
[...]

输出:

[...]
ATOM   4149  C   LEU C   9     136.820 120.050  53.540  1.00  0.00
ATOM   4150  O   LEU C   9     136.600 118.860  53.240  1.00  0.00
ATOM   4151  O   LEU C   9     137.310 120.340  54.650  1.00  0.00
TER
ATOM   4154  N   LYS D   2     115.050 134.940  61.060  1.00  0.00
ATOM   4155  H1  LYS D   2     115.660 134.160  61.180  1.00  0.00
ATOM   4156  H2  LYS D   2     114.760 135.000  60.100  1.00  0.00
[...]

所以模式是:如果经过" C"第一次" D"发现添加" TER"之前" D" line(在" C"行之后)。所有其他数字和字符都可以变化。

我在sed命令中找到了一些例子但是我不知道如何添加到上一行。

1 个答案:

答案 0 :(得分:2)

使用awk

$ awk 'last_c5=="C" && $5=="D" {print "TER"}; last_c5=$5' file
ATOM   4149  C   LEU C   9     136.820 120.050  53.540  1.00  0.00
ATOM   4150  O   LEU C   9     136.600 118.860  53.240  1.00  0.00
ATOM   4151  O   LEU C   9     137.310 120.340  54.650  1.00  0.00
TER
ATOM   4154  N   LYS D   2     115.050 134.940  61.060  1.00  0.00
ATOM   4155  H1  LYS D   2     115.660 134.160  61.180  1.00  0.00
ATOM   4156  H2  LYS D   2     114.760 135.000  60.100  1.00  0.00

它会跟踪最后一个第5列值,将其存储在last_c5变量中。如果上一个为C且当前为D,则会打印TER。在last_c5=$5正在打印所有行。