特定の行の一部の行を削除した後、awkを使用して行の総数を印刷するにはどうすればよいですか?

特定の行の一部の行を削除した後、awkを使用して行の総数を印刷するにはどうすればよいですか?

私の一般的な入力

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

おすすめ記事