Несколько основных (построчных блоков) в AWK

Подскажите, возможно ли в одном выводе AWK сформировать несколько выходных таблиц? Знаю, что можно делать несколько блоков BEGIN и END в одном запросе, но про основной блок не встречал подобную информацию.

Пример к которому стремлюсь

BEGIN {print "HEAD"}
{print "Строки обособленной таблицы №1} 
{print "Строки обособленной таблицы №2}
END {print "FOOTER"}

Этот пример выводит две таблицы в одной со строками в перемешку. А нужно чтобы выводилось две обособленные таблицы.


Ответы (1 шт):

Автор решения: Pak Uula

AWK - однопроходный процессор, он выводит сразу по завершению блока. Поэтому нужны хитрости, если вы хотите создавать сразу две таблицы.

Я вижу как минимум два варианта:

  1. Разные таблицы печатаются в разные файлы:

    BEGIN {
        print "HEAD" >> "t1.html";
        print "HEAD" >> "t2.html"
    }
    {print "Строки обособленной таблицы №1" >> "t1.html"} 
    {print "Строки обособленной таблицы №2" >> "t2.html" }
    END {
        print "FOOTER" >> "t1.html";
        print "FOOTER" >> "t2.html";
    }
    
  2. Строки разных таблиц печатаются с разными префиксами, затем при помощи tee и sed вывод разбирается в несколько файлов

    BEGIN { print "HEAD" }
    { print "1::Таблица 1" }
    { print "2::Таблица 2" }
    END { print "FOOTER" }
    

    Вызов:

    command |\
    awk -f some.awk |\
    tee \
      >(sed -e '/^1::/d;s/^[0-9]\+:://' > f2.html)\
      >(sed -e '/^2::/d;s/^[0-9]\+:://' > f1.html) 
    

    Здесь tee перенаправляет один поток в несколько команд для обработки. Каждая команда делает одно и то же:

    • /^1::/d - эта команда говорит sed, что нужно игнорировать строки, начинающиеся с 1::
    • s/^[0-9]\+::// - выполняя эту команду sed удаляет префиксы строк.

    В результате в f1.html будет

    HEAD
    Таблица 1
    FOOTER
    

    а в f2.html, соответственно

    HEAD
    Таблица 2
    FOOTER
    
→ Ссылка