这个问题是我之前发表的题为“从正则表达式中选择数字”的帖子的继续。
以下是先前帖子中公布的样本数据。
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代码中编写循环来选择这些对并立即删除这些行。
我希望提前多多感谢。
答案 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}