私の一般的な入力
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)を削除しました。このスクリプトでは、分子の原子が1つだけ(水分子には3つの原子があるため、3回見ることができます、たとえば10SOL)、その座標に配置すると、分子全体が削除されることがわかります。 2番目の行には、原子の総数(原子あたり=行あたり)が表示されます。これらの分子の一部を除去すると数字は減少するが、2行目に印刷する方法がわかりません。たとえば、2 番目の行が 177255 ではなく 119763 であるとします。 (最初の2行はシステム(原子ではない)に関する情報であるため、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