Редактирование большого текстового файла с помощью awk или любого другого редактора: цикл для изменения n-й строки

#awk #notepad #notepad

#awk #notepad #блокнот

Вопрос:

У меня есть большой (2 Гб) текстовый файл со следующей структурой:

 -------------------------------------------------------------------------------
176 (comment: line 1)
  i =        1 (comment: line 2)
H -0.073307  8.187645  4.065238 (comment: line 3)
H 1.964613  5.187168  7.038084 (comment: line 4)
... (comment: lines 5 - 178)
176 (comment: line 179)
  i =        2 (comment: line 180)
H -0.055549  8.224715  4.041477 (comment: line 181)
H 1.971048  5.193901  7.012246 (comment: line 182)
... (comment: lines 183 - 356)
-------------------------------------------------------------------------------
  

Это результат выполнения программы Molecular Dynamics.

176 — количество атомов, ‘i = n’ — количество итераций, а строки ниже — координаты атомов. Мне нужно написать скрипт для изменения двух первых строк для каждой итерации следующим образом очень большой текст следующим образом:

 -------------------------------------------------------------------------------   
176 (comment: line 1)
  i =        1, time =        0.500, E =      -100.0000000000 (comment: line 2)  
H -0.073307  8.187645  4.065238 (comment: line 3)
H 1.964613  5.187168  7.038084 (comment: line 4)
... (comment: lines 5 - 178)
176 (comment: line 179)
  i =        2, time =        1.000, E =      -100.0000000000 (comment: line 2)
H -0.055549  8.224715  4.041477 (comment: line 181)
H 1.971048  5.193901  7.012246 (comment: line 182)
(comment: lines 183 - 356)
-------------------------------------------------------------------------------
  

Это означает, что для итерации i = n требуется время = 0,500 * n и энергия (здесь нужно указать константу, -100,0000000000), так что, например.

 i =        1000, time =        500.000, E =      -100.0000000000 
  

Я знаю, что это тривиально, но я совершенно потерян.

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

1. являются ли пустые строки частью выходных данных?

2. После того, как вы вставили код / содержимое, вы можете выбрать его и нажать {} кнопку или использовать короткое нажатие на клавиатуре Ctrl K для его форматирования. И, пожалуйста, расскажите нам, что вы пробовали, важно продемонстрировать ваши собственные усилия, чтобы получить хорошие ответы.

3. В выходных данных нет пустых строк, извините, я никогда не использовал stack overflow…

4. Действительно ли ---- строки присутствуют в вашем входном файле? Если нет, то удалите их из вашего примера.

Ответ №1:

 $ awk 'match($0,/^[[:space:]] i =[[:space:]] [0-9] /) {
    $0 = sprintf("%s, time =        %0.3f, E =        -100.0000000000%s", substr($0,1,RLENGTH), 0.5 * (  n), substr($0,RLENGTH 1))
} 1' file
-------------------------------------------------------------------------------
176 (comment: line 1)
  i =        1, time =        0.500, E =        -100.0000000000 (comment: line 2)
H -0.073307  8.187645  4.065238 (comment: line 3)
H 1.964613  5.187168  7.038084 (comment: line 4)
... (comment: lines 5 - 178)
176 (comment: line 179)
  i =        2, time =        1.000, E =        -100.0000000000 (comment: line 180)
H -0.055549  8.224715  4.041477 (comment: line 181)
H 1.971048  5.193901  7.012246 (comment: line 182)
... (comment: lines 183 - 356)
-------------------------------------------------------------------------------