Сценарий Bash для удаления определенной части

#bash #if-statement

#bash #оператор if

Вопрос:

Я хочу написать скрипт, который преобразует дробную систему координат в декартову систему координат.

Здесь, во входном файле, у меня есть несколько ненужных разделов, которые я хочу удалить. Чтобы удалить верхний ненужный раздел, я просто использую sed -i '1,7 s/.*//g' geometry.xyz (первые 7 строк всегда не нужны). Но моя проблема в том, что требуемый мне раздел может измениться в размере. Это выглядит примерно так:

 %BLOCK LATTICE_CART
      10.000000000000000       0.000000000000000       0.000000000000000
       0.000000000000000      10.000000000000000       0.000000000000000
       0.000000000000000       0.000000000000000      10.000000000000000
%ENDBLOCK LATTICE_CART

%BLOCK POSITIONS_FRAC
  H   0.3242730364399766  -0.5778932059463918   0.4725289033063597
  H   0.3242730880505244  -0.4462573476378897   0.3408930320952251
  H   0.5269396206127043  -0.6403171603506288   0.3779836353112689
  H   0.4391824086567526  -0.6285598118052995   0.5417408894621464
  H   0.6929877354648144  -0.5297761432888469   0.4524840992286400
  H   0.6466039123419516  -0.6708589950924689   0.5647345854707825
  H   0.6049230092979219  -0.4959539583844693   0.6129729324712603
  H   0.4279396231283572  -0.3487419832103440   0.5700442724565965
  C   0.3622730487068306  -0.4740752814020994   0.4447109742648412
  C   0.4762730467994820  -0.4740752814020994   0.4447109742648412
  C   0.5142730074557883  -0.5778932235717150   0.4725289080290508
  C   0.6146969322498489  -0.5686205772550322   0.5256801349609578
  O   0.5142730074557883  -0.3980752729966930   0.5207109826702476
%ENDBLOCK POSITIONS_FRAC

%BLOCK KPOINTS_LIST
   0.0000000000000000   0.0000000000000000   0.0000000000000000       1.000000000000000
%ENDBLOCK KPOINTS_LIST

%BLOCK CELL_CONSTRAINTS
       1       2       3
       4       5       6
%ENDBLOCK CELL_CONSTRAINTS

FIX_COM : false
%BLOCK IONIC_CONSTRAINTS
%ENDBLOCK IONIC_CONSTRAINTS 
  

Теперь в моей системе может быть больше водорода, кислорода или углерода. Итак, я хочу, чтобы скрипт нашел% и удалил все после этого. Возможно ли это?
Спасибо

Комментарии:

1. Это, безусловно, возможно, но SO не является бесплатной сделкой по написанию моего кода. Если у вас возникли какие-либо особые трудности с кодом, который вы пишете, отредактируйте свой вопрос, включив его, и люди здесь будут рады помочь. В противном случае попробуйте и покажите признаки усилий. Спасибо.

2. Вы начали с описания того, что вы хотели, затем вы начали говорить о дополнительном кислороде, не сказав, как это может выглядеть в ваших данных! И затем вы хотите удалить все после знака процента, когда ваши данные заполнены знаками процента! Пожалуйста, покажите ваш ожидаемый результат, чтобы мы могли понять.

Ответ №1:

 awk '/%ENDBLOCK POSITIONS_FRAC/{ exit }; p; /%BLOCK POSITIONS_FRAC/{p = 1};' geometry.xyz
  

Дало бы

   H   0.3242730364399766  -0.5778932059463918   0.4725289033063597
  H   0.3242730880505244  -0.4462573476378897   0.3408930320952251
  H   0.5269396206127043  -0.6403171603506288   0.3779836353112689
  H   0.4391824086567526  -0.6285598118052995   0.5417408894621464
  H   0.6929877354648144  -0.5297761432888469   0.4524840992286400
  H   0.6466039123419516  -0.6708589950924689   0.5647345854707825
  H   0.6049230092979219  -0.4959539583844693   0.6129729324712603
  H   0.4279396231283572  -0.3487419832103440   0.5700442724565965
  C   0.3622730487068306  -0.4740752814020994   0.4447109742648412
  C   0.4762730467994820  -0.4740752814020994   0.4447109742648412
  C   0.5142730074557883  -0.5778932235717150   0.4725289080290508
  C   0.6146969322498489  -0.5686205772550322   0.5256801349609578
  O   0.5142730074557883  -0.3980752729966930   0.5207109826702476