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

У меня большой (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' - количество итераций, а строки ниже - атомные координаты.Мне нужно написать скрипт для изменения двух первых строк для каждой итерации следующим образом: очень большой текст txt следующим образом:

-------------------------------------------------------------------------------   
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 Ответ

1 голос
/ 13 марта 2019
$ 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)
-------------------------------------------------------------------------------
...