특정 행의 일부 행을 삭제한 후 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) 해당 좌표에 위치하면 전체 분자가 삭제된다는 것을 알 수 있습니다. 두 번째 행에서 총 원자 수(원자당 = 행당)를 볼 수 있습니다. 이 분자 중 일부를 제거하면 숫자는 감소하지만두 번째 줄에 어떻게 인쇄하는지 모르겠습니다. 예를 들어, 두 번째 행이 177255가 아닌 119763이기를 원합니다. (처음 두 줄은 시스템(원자가 아님)에 대한 정보이기 때문에 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한 줄에 3줄씩 인쇄 조건을 평가하고, 조건이 충족되는지 여부를 3줄마다 인쇄합니다. 결과를 역으로 캡처하기 전에 무조건 마지막 두 줄을 인쇄합니다.

관련 정보