我的典型輸入
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
每行三行的列印條件,並在每三行後列印是否符合條件。在反向捕獲結果之前,無條件列印最後兩行。