从数据文件中删除选定的行

时间:2011-09-08 05:17:34

标签: awk

这个问题是我之前发表的题为“从正则表达式中选择数字”的帖子的继续。

以下是先前帖子中公布的样本数据。

          DONOR         ACCEPTORH      ACCEPTOR           
    atom#  res@atom   atom#  res@atom atom#  res@atom %occupied  distance       angle        
  |  4726   59@O12 |  1487    19@H12  1486    19@O12 |  85.66  2.819 ( 0.18)  21.85 (12.11)        
  |  1499   19@O15 |  1730    22@H12  1729    22@O12 |  83.15  3.190 ( 0.31)  22.36 (12.73)        
  |  1216   16@O22 |  1460    19@H22  1459    19@O22 |  75.74  2.757 ( 0.14)  24.55 (13.66)        
  |  4232   53@O25 |  4143    52@H24  4142    52@O24 |  74.35  2.916 ( 0.25)  28.27 (13.26)        
  |  3683   46@O16 |  4163    52@H13  4162    52@O13 |  73.78  2.963 ( 0.29)  23.65 (14.14)        
  |  4162   52@O13 |  4079    51@H12  4078    51@O12 |  73.68  2.841 ( 0.19)  21.25 (11.87)        
  |  3764   47@O16 |  3825    48@H26  3824    48@O26 |  70.52  2.973 ( 0.28)  26.88 (13.14)        
  .
  .
  The lines goes few thousands.

我厌倦了Fredirk的代码,它可以很好地选择线条。那么,现在我想把这个想法扩展到我真正的问题。

我的数据文件中的$ 3(第3个字段)和$ 6(第6个字段)代表“数字分子”,其排列如下:

   1    2   3   4   5   6   7       8

   9    10  11  12  13  14  15      16
  17    18  19  20  21  22  23      24
  25    26  27  28  29  30  31      32
  33    34  35  36  37  38  39      40
  41    42  43  44  45  46  47      48
  49    50  51  52  53  54  55      56

  57    58  59  60  61  62  63      64 

由上述数字组成的任何对实际上代表数据文件中每一行的第3和第6字段中的对。

我想要的是选择仅由排列在上述排序的最外面行的数字组成的对。

 In short, ANY PAIRS made by only the numbers  (1 2 3 4 5 6 7 8   57 58 59 60 61 62 63 64   1 9 17 25 33 41 49 57   8 16 24 32 40 48 56 64) are need to be deleted.

我不知道如何在awk代码中编写循环来选择这些对并立即删除这些行。

我希望提前多多感谢。

1 个答案:

答案 0 :(得分:1)

使用数组来保存数字集。在BEGIN块

中定义它
BEGIN {
  i=0
  for (n=1; n<=8; n++) set[i++] = n
  for (n=57; n<=64; n++) set[i++] = n
  for (n=9; n<=49; n+=8) {set[i++] = n; set[i++] = n+7}
}

然后,检查$ 3和$ 6是否都在(或不在)集合中:

($3 in set) && ($6 in set) {next}