Как отформатировать выходные данные из awk - PullRequest
2 голосов
/ 24 сентября 2019

, поэтому я распечатываю (эхо) 7 переменных (строк) разной длины и передаю их в awk, чтобы они были хорошо выровнены.Каждое поле имеет различную длину поля.

Пример:

$ echo "one MISSING three four five six seven" | awk '{printf "%-17s %-29s %-22s %-25s %-12s %-11s %-25s\n", $1, $2, $3, $4, $5, $6, $7}'
one               MISSING                       three                  four                      five         six         seven                    

Но .. бывают случаи, когда скрипт, который генерирует эти переменные, не имеет реального значения, поэтому я заполняюих со строкой "MISSING".

Я бы хотел, чтобы awk напечатал строку MISSING красным цветом ... эта строка может быть в любом поле.

Я сделал это:

echo "one MISSING three four five six seven" | awk '{gsub(/MISSING/,"\033[0;31m&\033[0m\t");printf "%-17s %-29s %-22s %-25s %-12s %-11s %-25s\n", $1, $2, $3, $4, $5, $6, $7}'
one               MISSING            three                  four                      five         six         seven                    

и оно красиво печатает красным цветом слово MISSING, но оно портится с выводом, поля больше не выровнены.Поэтому, когда читается больше записей (для цикла), вывод больше не выравнивается.Поскольку слово MISSING может быть в любом поле.

Что-то происходит с форматированием printf, что оно не учитывает длину для этого конкретного поля, оно делает его намного меньше.

Спасибовы!

Ответы [ 2 ]

2 голосов
/ 25 сентября 2019

Зачем добавлять все эти дополнительные столбцы и интервалы, если вы можете продемонстрировать проблему с помощью всего 3 небольших полей?

$ printf "one two three\none MISSING three\n" |
    awk '{gsub(/MISSING/,"\033[0;31m&\033[0m");printf "%-5s %-10s %-5s\n", $1, $2, $3}'
one   two        three
one   MISSING three

Проблема заключается в том, что ваш printf (правильно) включает непечатаемые символы при определениикак выглядит вывод.Вы можете увидеть их, если передадите по трубопроводу на cat -v:

$ printf "one two three\none MISSING three\n" |
    awk '{gsub(/MISSING/,"\033[0;31m&\033[0m");printf "%-5s %-10s %-5s\n", $1, $2, $3}' | cat -v
one   two        three
one   ^[[0;31mMISSING^[[0m three

, поэтому при определении ширины поля, которое вы хотите напечатать для «MISSING», вам необходимо включить количество этих символов:

$ cat tst.awk
BEGIN {
    split("5 10 5",width)
}
{
    for (i=1; i<=NF; i++) {
        w = width[i]
        if ($i == "MISSING") {
            $i = "\033[0;31m" $i "\033[0m"
            w += (length($i) - length("MISSING"))
        }
        printf "%-*s", w, $i
    }
    print ""
}

$ printf "one two three\none MISSING three\n" | awk -f tst.awk
one  two       three
one  MISSING   three

Массаж для ... ... 1011 *

0 голосов
/ 26 сентября 2019

Альтернативным решением является вставка кодов управления цветом после форматирования:

echo "one MISSING three four five six seven" |
awk '{s = sprintf("%-17s %-29s %-22s %-25s %-12s %-11s %-25s", $1, $2, $3, $4, $5, $6, $7)
      gsub(/MISSING/, "\033[0;31m&\033[0m", s)
      print s}'
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...