Как сохранить пробелы и использовать функцию потолка с встроенным редактором One-Liner Awk? - PullRequest
2 голосов
/ 13 сентября 2010

У меня есть файл конфигурации, который имеет переменные и значения, разделенные пробелами. Я хочу взять значение (во втором столбце) определенных совпадений и встроенным редактировать файл, разделив это совпадение на 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!

1 Ответ

2 голосов
/ 13 сентября 2010
$ awk '$1~/[fF]req|output/{ n=$2/2; sub(/ [0-9][0-9]*$/,n)}1' file
OTHER TEXT 1
OTHER TEXT 2
restartfreq       162.5
dcdfreq           162.5
xstFreq           162.5
outputEnergies    162.5
outputPressure    162.5
OTHER TEXT 3
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...