我的典型输入
900 mgdg molecules in water t= 600000.00000 step= 400000000
177255
10SOL OW16116 1.061 22.319 11.775
10SOL HW116117 1.055 22.235 11.820
10SOL HW216118 1.039 22.299 11.684
11SOL OW16119 5.139 22.001 12.004
11SOL HW116120 5.153 21.907 12.014
11SOL HW216121 5.098 22.029 12.086
12SOL OW16122 0.276 21.154 1.574
12SOL HW116123 0.191 21.136 1.535
12SOL HW216124 0.331 21.081 1.546
13SOL OW16125 5.557 5.920 7.573
13SOL HW116126 5.631 5.980 7.565
13SOL HW216127 5.581 5.861 7.645
14SOL OW16128 4.326 5.682 7.553
14SOL HW116129 4.231 5.675 7.562
14SOL HW216130 4.352 5.598 7.514
15SOL OW16131 4.067 1.679 1.120
15SOL HW116132 4.022 1.619 1.060
15SOL HW216133 4.146 1.632 1.146
16SOL OW16134 3.419 6.063 5.346
16SOL HW116135 3.369 6.065 5.427
16SOL HW216136 3.487 5.997 5.360
17SOL OW16137 5.588 17.086 1.044
17SOL HW116138 5.607 17.063 1.135
17SOL HW216139 5.588 17.003 0.997
18SOL OW16140 2.583 1.538 0.854
18SOL HW116141 2.555 1.594 0.781
18SOL HW216142 2.640 1.473 0.813
19SOL OW16143 5.027 21.387 5.795
19SOL HW116144 4.959 21.399 5.861
19SOL HW216145 5.071 21.472 5.790
20SOL OW16146 2.035 14.487 10.380
20SOL HW116147 2.116 14.534 10.358
20SOL HW216148 1.977 14.554 10.414
21SOL OW16149 0.525 22.084 5.174
21SOL HW116150 0.615 22.054 5.168
21SOL HW216151 0.520 22.125 5.260
22SOL OW16152 2.687 3.909 4.936
22SOL HW116153 2.629 3.867 4.999
22SOL HW216154 2.706 3.995 4.974
23SOL OW16155 4.065 13.279 11.813
23SOL HW116156 3.996 13.250 11.874
23SOL HW216157 4.060 13.374 11.816
我的剧本
awk 'BEGIN {
while (getline < "eq2_1.gro") {
if ($1 ~ /SOL/ && ($NF < 3.977 || $NF > 7.947 || $(NF-1) < 12.741 || $(NF-1) > 22.240))
name[$1]=$1}
}
{
if ($1 != name[$1])
print
}
END {
if (NR==2) {print NR-2}}' eq2_1.gro | tee eq3_1.gro
在此脚本中,我删除了正确坐标之间的水分子 (SOL)。在此脚本中,您可以看到,如果分子中只有一个原子(一个水分子中有三个原子,这就是为什么您可以看到三次,例如 10SOL)位于该坐标中 - 整个分子将被删除。您可以在第二行中看到 - 原子总数(每个原子 = 每行)。当我删除其中一些分子后 - 数量会减少,但是我不知道如何在第二行打印它。例如,我想要第二行是 119763,而不是 177255。 (NR-2,因为前两行是有关系统(而不是原子)的信息)。
答案1
看一下这个:
BEGIN {ln=1}
!($1 ~ /SOL/ && ($NF < 3.977 || $NF > 7.947 || $(NF-1) < 12.741 || $(NF-1) > 22.240)) {
toprint[ln]=$0 #All lines that should be printed will be here
total=total+1 #The total number of lines to be printed
}
{ln=ln+1;}
END {
print toprint[1] #Prints top line of original file
print total-2 #Number of resulting lines - 2 (number of atoms)
for (i=3;i<=NR;i++){
if (toprint[i]!=0) print(toprint[i]) #Prints atoms lines
}
}
您提供的文件将返回以下输出:
900 mgdg molecules in water t= 600000.00000 step= 400000000
6
19SOL OW16143 5.027 21.387 5.795
19SOL HW116144 4.959 21.399 5.861
19SOL HW216145 5.071 21.472 5.790
21SOL OW16149 0.525 22.084 5.174
21SOL HW116150 0.615 22.054 5.168
21SOL HW216151 0.520 22.125 5.260
答案2
也试试
$ tac file | awk -vP=1 '
{TMP[NR%3] = $0
P = P * (($NF > 3.977) && ($NF < 7.947) && ($(NF-1) > 12.741) && ($(NF-1) < 22.240))
}
!(NR%3) {if (P) {print TMP[1]
print TMP[2]
print
CNT += 3
}
P = 1
}
END {print CNT
print
}
' | tac
900 mgdg molecules in water t= 600000.00000 step= 400000000
6
19SOL OW16143 5.027 21.387 5.795
19SOL HW116144 4.959 21.399 5.861
19SOL HW216145 5.071 21.472 5.790
21SOL OW16149 0.525 22.084 5.174
21SOL HW116150 0.615 22.054 5.168
21SOL HW216151 0.520 22.125 5.260
它将反转文件,评估P
每行三行的打印条件,并在每三行后打印是否满足条件。在反向捕获结果之前,无条件打印最后两行。