在删除特定行中的一些行后,如何使用 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)。在此脚本中,您可以看到,如果分子中只有一个原子(一个水分子中有三个原子,这就是为什么您可以看到三次,例如 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每行三行的打印条件,并在每三行后打印是否满足条件。在反向捕获结果之前,无条件打印最后两行。

相关内容