Мой типичный вклад
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
Он выполнит обратную cat-обработку файла, оценит P
условие rint на каждой строке для трех строк и после каждых трех строк выведет, выполнены ли условия. Последние две строки печатаются безусловно перед обратной cat-обработкой результата.