Можно ли красиво напечатать код Awk? - PullRequest
6 голосов
/ 18 апреля 2019

Довольно часто я пишу Awk однострочные , которые со временем усложняются.

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

Для этого: есть ли какой-нибудь способ, которым я могу красиво напечатать код Awk, чтобы я мог иметь больше смысла из этого?

Например, учитывая это:

awk 'flag{ if (/PAT2/){printf "%s", buf; flag=0; buf=""} else buf = buf $0 ORS}; /PAT1/{flag=1}' file

Как мне получить что-то более читабельное?

1 Ответ

5 голосов
/ 18 апреля 2019

Эд Мортон показал мне , что в GNU awk есть опция -o для красивой печати:

Руководство пользователя GNU Awk, на Опции

-о [файл]
- довольно-печать [= файл]

Включить симпатичную печать awk-программ. Подразумевает --no-optimize. По умолчанию программа вывода создается в файле с именем awkprof.out (см. Профилирование ). Необязательный аргумент file позволяет указать другое имя файла для вывода. Не допускается пробел между -o и файлом , если указан файл .

ПРИМЕЧАНИЕ. В прошлом эта опция также выполняла вашу программу. Это больше не так.

Таким образом, ключом здесь является использование -o с:

  • ничего, если мы хотим, чтобы вывод автоматически сохранялся в "awkprof.out".
  • - для вывода в стандартный вывод.
  • file для сохранения вывода в файле с именем file .

Посмотреть вживую:

$ gawk -o- 'BEGIN {print 1} END {print 2}'
BEGIN {
    print 1
}

END {
    print 2
}

Или:

$ gawk -o- 'flag{ if (/PAT2/){printf "%s", buf; flag=0; buf=""} else buf = buf $0 ORS}; /PAT1/{flag=1}' file
flag {
    if (/PAT2/) {
        printf "%s", buf
        flag = 0
        buf = ""
    } else {
        buf = buf $0 ORS
    }
}

/PAT1/ {
    flag = 1
}
...