У меня есть файл конфигурации, который имеет переменные и значения, разделенные пробелами. Я хочу взять значение (во втором столбце) определенных совпадений и встроенным редактировать файл, разделив это совпадение на 2. Я также хотел бы сохранить интервал и использовать функцию потолка для значения.
Например, файл:
Напомним, используя файл примера, если мой файл:
OTHER TEXT 1
OTHER TEXT 2
restartfreq 325
dcdfreq 325
xstFreq 325
outputEnergies 325
outputPressure 325
OTHER TEXT 3
станет:
OTHER TEXT 1
OTHER TEXT 2
restartfreq 163
dcdfreq 163
xstFreq 163
outputEnergies 163
outputPressure 163
OTHER TEXT 3
Я бы предпочел сделать все это в скрипте Bash, используя команды Linux. Я подумывал о переходе на небольшую программу на C ++, но сейчас я придерживаюсь решения, основанного на скриптах.
Работая над этим, я отправил запрос на прошлой неделе:
Как я могу смешивать математику с регулярными выражениями в Awk или Sed?
В конце концов я пришел к многословному решению, но ghostdog74 предложил это более красноречивое решение:
awk '$1=="restartfreq"{$2=$2/2;}1' file > t && mv t file
Это делает то, что я хочу ... почти.
Как я уже сказал, мне также нужно реализовать функцию потолка и, желательно, сохранить пробел - и я бы хотел, чтобы он мог делить значения нескольких совпадений, а не только одного.
Могу ли я сделать это с помощью однострочного или небольшого вложенного сценария awk? Любые советы ??
Решение:
Я принял ответ Призрачной собаки:
awk '$1~/[fF]req|output/{ n=$2/2; sub(/ [0-9][0-9]*$/,n)}1' file
И немного изменил его, чтобы разрешить комментарии в конце строки и выполнить потолок согласно моей просьбе. Я собираюсь спросить отдельную функцию о том, как использовать короткие функции в awk one liners.
awk '$1~/restartfreq|dcdfreq|xstFreq|outputEnergies|outputPressure/{ a=$2/2; n= (a== int(a)) ? a : int(a)+1; sub(/ [0-9][0-9]*.*$/,n)}1' file > temp && mv -f temp file
Хорошая работа Ghostdog!