Далее определите операцию сопоставления и разделения GAWK - PullRequest
0 голосов
/ 15 февраля 2019

У меня есть несколько TXT-файлов с номерами, которые мне нужно разделить на 4. Текстовая строка, которую я сопоставляю и изменяю, такова: -

scale = 23 23

Мой маленький файл GAWK выглядит следующим образом: -

/scale [\=] [0-9]+ [0-9]+/ {
    $3 = int($3/4)
    $4 = int($4/4) }
{print}

Итак, я успешно получаю "scale = 5 5"

Но у меня есть еще 3 требования, и я хотел бы помочь ...

1) параметр "scale" должен быть только таким, который следует за другим соответствием, называемым "detail" в некоторых строках над ним.(поэтому вместо простого сопоставления с каждым "scale =" это будет "detail (.....) scale =") (любое число / буква / + перевод строки между ними)

2) эти значения "шкала "никогда не должна быть ниже 1. (деление чего-либо ниже 6 всегда должно давать результат 1 (просто изменив значения" scale = 0 "на" scale = 1 "после выполнения))

3) значенияжелательно округлять вверх, а не вниз.(поэтому вместо 5 здесь из 23, на самом деле это 5,75 и должно округляться до 6 (это не так важно, но было бы неплохо))

1 Ответ

0 голосов
/ 15 февраля 2019

Возможно, что-то подобное?

awk '/detail/ { d=1 }
    d && /scale = [0-9]+ [0-9]+/ && $3>1 && $4>1 {
        $3 = $3<6 ? 1 : sprintf("%1.0f", $3/4)
        $4 = $4<5 ? 1 : sprintf("%1.0f", $4/4)
        d = 0 }
    1'

sprintf с подходящим спецификатором формата применяет округление (см., Например, https://www.gnu.org/software/gawk/manual/html_node/Round-Function.html)

Тернарный оператор x ? y : z создает y, еслиx верно, в противном случае z.

Обратите внимание также на незначительные упрощения (= не требует обратной косой черты или класса символов, а {print} может быть сокращено до 1).

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