Como usar o awk para imprimir o número total de linhas, após deletar algumas delas em uma linha específica?

Como usar o awk para imprimir o número total de linhas, após deletar algumas delas em uma linha específica?

Minha entrada típica

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

Meu roteiro

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

Neste script eu excluo moléculas de água (SOL) entre as coordenadas corretas. Neste script você pode ver que se apenas um átomo da molécula (temos três átomos em uma molécula de água, é por isso que você pode ver três vezes, por exemplo 10SOL) estiver nessas coordenadas - a molécula inteira será deletada. Você pode ver na segunda linha – número total de átomos (cada átomo = cada linha). Depois de excluir algumas dessas moléculas - o número será menor, masNão sei como imprimir isso na segunda linha. Por exemplo, em vez de 177255, quero 119763 na segunda linha. (NR-2, porque as duas primeiras linhas são informações sobre o sistema (não sobre átomos)).

Responder1

Veja isso:

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

A seguinte saída será retornada do arquivo que você forneceu:

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

Responder2

Experimente também

$ 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

Ele reverterá o arquivo, avaliará a Pcondição de impressão por linha para três linhas e, após cada três linhas, imprimirá se as condições forem atendidas. As duas últimas linhas são impressas incondicionalmente antes de reverter o resultado.

informação relacionada