Wie verwendet man awk, um die Gesamtzahl der Zeilen auszudrucken, nachdem einige davon in einer bestimmten Zeile gelöscht wurden?

Wie verwendet man awk, um die Gesamtzahl der Zeilen auszudrucken, nachdem einige davon in einer bestimmten Zeile gelöscht wurden?

Mein typischer Input

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

Mein Skript

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

In diesem Skript lösche ich Wassermoleküle (SOL) zwischen den richtigen Koordinaten. In diesem Skript können Sie sehen, dass das gesamte Molekül gelöscht wird, wenn sich nur ein Atom des Moleküls (wir haben drei Atome in einem Wassermolekül, deshalb sehen Sie beispielsweise dreimal 10SOL) in diesen Koordinaten befindet. Sie können in der zweiten Zeile die Gesamtzahl der Atome sehen (jedes Atom = jede Zeile). Nachdem ich einige dieser Moleküle gelöscht habe, wird die Zahl niedriger sein, aberIch weiß nicht, wie ich das in die zweite Zeile drucken soll. Statt 177255 möchte ich beispielsweise 119763 in der zweiten Zeile. (NR-2, da die ersten beiden Zeilen Informationen zum System (nicht zu Atomen) enthalten).

Antwort1

Schauen Sie sich das an:

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
    }
}

Aus der von Ihnen bereitgestellten Datei wird die folgende Ausgabe zurückgegeben:

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

Antwort2

Versuchen Sie auch

$ 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

Es wird die Datei umgekehrt caten, die PDruckbedingung pro Zeile für drei Zeilen auswerten und nach jeweils drei Zeilen drucken, wenn die Bedingungen erfüllt sind. Die letzten beiden Zeilen werden bedingungslos gedruckt, bevor das Ergebnis umgekehrt caten wird.

verwandte Informationen