如何根据与两个不同列相关的两个条件打印所有行?

如何根据与两个不同列相关的两个条件打印所有行?

我有以下一组数据,

ATOM     19  O   WAT     2      -5.435   5.542  -3.646  1.00  0.00           O
ATOM     20  H1  WAT     2      -4.824   5.163  -2.982  1.00  0.00           H
ATOM     21  H2  WAT     2      -5.318   6.499  -3.469  1.00  0.00           H
TER
ATOM     22  O   WAT     3       5.959   0.828   3.228  1.00  0.00           O
ATOM     23  H1  WAT     3       5.425   1.196   2.482  1.00  0.00           H
ATOM     24  H2  WAT     3       6.711   1.472   3.201  1.00  0.00           H
TER
ATOM     25  O   WAT     4      -1.704  -4.348  -2.017  1.00  0.00           O
ATOM     26  H1  WAT     4      -1.895  -3.911  -1.145  1.00  0.00           H
ATOM     27  H2  WAT     4      -1.980  -5.267  -1.782  1.00  0.00           H
TER
ATOM     28  O   WAT     5      -3.222  -3.303   5.524  1.00  0.00           O
ATOM     29  H1  WAT     5      -2.934  -3.466   4.594  1.00  0.00           H
ATOM     30  H2  WAT     5      -3.063  -2.335   5.580  1.00  0.00           H
TER
ATOM     31  O   WAT     6       5.528  -4.121  -0.508  1.00  0.00           O
ATOM     32  H1  WAT     6       6.456  -3.823  -0.552  1.00  0.00           H
ATOM     33  H2  WAT     6       5.492  -4.428   0.428  1.00  0.00           H
TER
ATOM     34  O   WAT     7       4.329   2.267   1.528  1.00  0.00           O
ATOM     35  H1  WAT     7       4.574   2.208   0.572  1.00  0.00           H
ATOM     36  H2  WAT     7       4.370   3.237   1.645  1.00  0.00           H
TER
ATOM     37  O   WAT     8      -6.042  -5.320  -1.141  1.00  0.00           O
ATOM     38  H1  WAT     8      -6.693  -4.716  -0.701  1.00  0.00           H
ATOM     39  H2  WAT     8      -5.277  -5.191  -0.531  1.00  0.00           H

我想检查第 3 列的字符串是否=O 且第 8 列的值是否 >0.0,在这种情况下我需要打印这一行和以下三行。

我可以打印适合一种条件的行,但无法将所有条件连接在一起

cat <inputfile>| awk '$8>0'

输出将是

ATOM     22  O   WAT     3       5.959   0.828   3.228  1.00  0.00           O
ATOM     23  H1  WAT     3       5.425   1.196   2.482  1.00  0.00           H
ATOM     24  H2  WAT     3       6.711   1.472   3.201  1.00  0.00           H
TER
ATOM     28  O   WAT     5      -3.222  -3.303   5.524  1.00  0.00           O
ATOM     29  H1  WAT     5      -2.934  -3.466   4.594  1.00  0.00           H
ATOM     30  H2  WAT     5      -3.063  -2.335   5.580  1.00  0.00           H
TER
ATOM     34  O   WAT     7       4.329   2.267   1.528  1.00  0.00           O
ATOM     35  H1  WAT     7       4.574   2.208   0.572  1.00  0.00           H
ATOM     36  H2  WAT     7       4.370   3.237   1.645  1.00  0.00           H

答案1

我认为你的意思是“打印这一行”而不是“删除”。如果第 3 列包含O且第 8 列大于 0,则可以设置一个计数器。如果计数器大于零,则打印该行并递减计数器。

$ awk '$3=="O" && $8>0{ p=4 } p-->0' file
ATOM     22  O   WAT     3       5.959   0.828   3.228  1.00  0.00           O
ATOM     23  H1  WAT     3       5.425   1.196   2.482  1.00  0.00           H
ATOM     24  H2  WAT     3       6.711   1.472   3.201  1.00  0.00           H
TER
ATOM     28  O   WAT     5      -3.222  -3.303   5.524  1.00  0.00           O
ATOM     29  H1  WAT     5      -2.934  -3.466   4.594  1.00  0.00           H
ATOM     30  H2  WAT     5      -3.063  -2.335   5.580  1.00  0.00           H
TER
ATOM     34  O   WAT     7       4.329   2.267   1.528  1.00  0.00           O
ATOM     35  H1  WAT     7       4.574   2.208   0.572  1.00  0.00           H
ATOM     36  H2  WAT     7       4.370   3.237   1.645  1.00  0.00           H
TER

答案2

awk '$3 == "O" && $8 > 0.0{x=NR+3}(NR<=x){print }' file

输出

ATOM     22  O   WAT     3       5.959   0.828   3.228  1.00  0.00           O
ATOM     23  H1  WAT     3       5.425   1.196   2.482  1.00  0.00           H
ATOM     24  H2  WAT     3       6.711   1.472   3.201  1.00  0.00           H
TER
ATOM     28  O   WAT     5      -3.222  -3.303   5.524  1.00  0.00           O
ATOM     29  H1  WAT     5      -2.934  -3.466   4.594  1.00  0.00           H
ATOM     30  H2  WAT     5      -3.063  -2.335   5.580  1.00  0.00           H
TER
ATOM     34  O   WAT     7       4.329   2.267   1.528  1.00  0.00           O
ATOM     35  H1  WAT     7       4.574   2.208   0.572  1.00  0.00           H
ATOM     36  H2  WAT     7       4.370   3.237   1.645  1.00  0.00           H
TE

相关内容