Как включить короткие функции в однострочники / отдельные команды Awk? - PullRequest
3 голосов
/ 13 сентября 2010

Я знаю, что обычно вы не хотите, чтобы однострочные / однорядные команды становились слишком длинными, но иногда кажется, что длинная однострочная команда выиграла бы от замены повторяющихся элементов функцией.

Можно ли использовать короткую функцию для сокращения длины вашей команды?

Например, насколько мне известно, в awk нет функции потолка или округления, поэтому вы можете написать функции

'function round(a){a=(a < int(a)+0.5) ? int(a) : int(a+1)}'

и

'function ceil(a){a=(a == int(a)) ? a : int(a)+1}'

Не могли бы вы включить эти функции?в один лайнер?

например

Не могли бы вы использовать его в скрипте, чтобы получить верхний предел файла

$ cat money.data
121.52 133.45 136.77 155.22
132.11 141.30 12.78 78.98
31.21 149.03 33.50 84.67

... который для функции потолка будет:

$ tail money.data
122 134 137 156
133 142 13 79
32 150 34 85

... и для функции округления было бы

$ tail money.data
122 133 137 155
132 141 13 79
31 149 34 85

Я играл со случайными операторами awk, но не мог понять, как объединить функции в однулайнеры ...

1 Ответ

3 голосов
/ 13 сентября 2010

Просто используйте оператор возврата в вашей функции:

function round(a){return (a < int(a)+0.5) ? int(a) : int(a+1)}
{for (f=1;f<=NF;f++) print round($f)}

Функции вызываются по значению, а не по ссылке, поэтому изменения значения переменной не влияют на переменные вызывающего.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...