Консолидировать повторяющийся префикс

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

Однако вы можете запустить сценарий как подпроцесс, который производит вывод HTML, перенаправляет этот вывод в файл и при необходимости добавляет любые окружающие заголовки перед передачей всего результирующего текстового блоба в sendmail -bm как есть (и полагаясь на sendmail для определения полей отправителя и получателя).

Что-то вроде очень надуманного примера:

>tempfile
echo 'From: nobody@localhost' >>tempfile
echo 'To: root@localhost' >>tempfile
echo 'Subject: list of files' >>tempfile
echo >>tempfile
ls -lh $HOME >>tempfile
echo 'Add more data here' >>tempfile
sendmail -bm <tempfile && rm -f tempfile

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

2
21.06.2017, 02:01
3 ответа
$ awk 'BEGIN {FS=":"} {comments[$1][NR]=$3} END {for (bug in comments) { print bug; for (comment in comments[bug]) { print "    ",comments[bug][comment] } } }  ' /path/to/input
Bug123
     SomeComment
     SecondComment
Bug222
     SomeOtherComment

Это работает путем создания многомерного -массива при чтении входного файла и последующего обхода результирующих данных в порядке появления «ошибок». С некоторыми небольшими изменениями это можно изменить для сортировки массива внешнего уровня -.

4
27.01.2020, 21:51

Вот забавный способ сделать это вvi(или, на самом деле, в ex, если вы опускаете начальные двоеточия для каждой команды):

:%!awk -F: '{a[$1];print} END {for (i in a) {print i}}'
:v/:/m0
:%!sort -st: -k1,1
:%s/^.*:/\t/

Пояснение:

Команда Awk печатает каждую строку как -и выводит список всех уникальных первых полей в конце вашего файла.

Команда vmперемещает на строку 0 (начало файла )все строки, в которых нет двоеточия. (Другими словами, список первых полей, выводимых из awk.)

Команда sortвыполняет сортировку таблицы s, сохраняя порядок строк, кроме расположения их в соответствии с первым полем. (Мы уже переместили поля «заголовок» в начало файла.)

Затем команда замены sпревращает префикс каждой строки заголовка, отличной от -, во вкладку.


Результат предоставленного вами ввода:

Bug123
    SomeComment
    SecondComment
Bug222
    SomeOtherComment

Дополнительные пояснения:

:(двоеточие )— это то, что вы вводите в vi, чтобы начать команду в стиле ex-.

%— это диапазон адресов в ex. Это означает «применить следующее действие/команду ко всем строкам в файле буфера ()».

При использовании с адресом !начинает «фильтр» вex:строки, указанные адресом, подаются в качестве входных данных для указанной внешней команды и заменяются в буфере выходными данными этой команды.

-F:устанавливает разделитель полей Awk.

{}(фигурные скобки )используются в Awk для окружения команд, которые должны быть запущены. Поскольку перед фигурными скобками (в одинарных кавычках )нет адреса Awk , действия в фигурных скобках применяются к каждой строке ввода.

a[$1]создает элемент массива, используя первое поле текущей строки($1)в качестве индекса. Поскольку здесь не указано = "whatever", элемент массива не имеет значения , но это не имеет значения; мы просто хотим, чтобы массив содержал этот элемент.

;завершает эту команду Awk.

print— это команда Awk для печати текущей строки (по умолчанию )или любых переданных аргументов (, как в более позднемprint i).

ENDпомечает блок действий (в фигурных скобках )для выполнения после обработки всех входных данных (в Awk ).

Цикл forпечатает все индексы массива с именем a. Какие из первых полей файла журнала de -дублируются в произвольном порядке.

Вот вам и команда Awk.

Команда v— это команда ex, противоположная общей команде g. gвыполняет действие над всеми строками, соответствующими определенному шаблону. vвыполняет указанное действие на всех строках, НЕ соответствующих заданному шаблону.

/запускает и заканчивает шаблон. В данном случае это просто :.

mозначает «движение». Таким образом, :v/:/m0в viперемещает все строки, не содержащие двоеточий, в начало файла.

Остальные команды должны быть достаточно понятными.:)

2
27.01.2020, 21:51

перламутровый -вкладыш

perl -MList::Util=uniq -F: -lane '
        push @keys, $F[0];
        push @{ $comment{$F[0]} }, $F[2];
    } END { 
        for $key (uniq @keys) {
            print $key;
            print "    $_" for @{$comment{$key}};
        }
' file
2
27.01.2020, 21:51

Теги

Похожие вопросы