У меня есть файл журнала, как:
Bug123:c:SomeComment
Bug222:c:SomeOtherComment
Bug123:c:SecondComment
Мне нужно произвести:
Bug123
SomeComment
SecondComment
Bug222
SomeComment
Используя bash, я не могу придумать способ сделать это простым способом. Есть идеи?
shell-script
string
text-formatting
Лев Уфимцев
источник
источник
git shortlog
команде.Ответы:
Это работает путем настройки многомерного массива во время чтения входного файла и последующего обхода результирующих данных в порядке, в котором видны «ошибки». С некоторыми небольшими изменениями это можно изменить для сортировки массива внешнего уровня.
источник
vim
на то, что поначалу выглядит очень тупо, но как только вы впитываете зубы, это очень быстро для изучения и может быть очень мощным инструментом. Смотрите такжеsed
.Вот интересный способ сделать это
vi
(или, на самом деле,ex
если вы пропустите ведущие двоеточия для каждой команды):Объяснение:
Команда Awk печатает каждую строку как есть и выводит список всех уникальных первых полей в конце вашего файла.
v
Командаm
Oves на линию 0 (начало файла) все строки , которые не имеют каких - либо двоеточие. (Другими словами, список первых полей, выводимых изawk
.)Команда
sort
выполняетs
сортировку таблиц, сохраняя порядок строк, не располагая их в соответствии с первым полем. (Мы уже переместили поля заголовка в начало файла.)Затем команда
s
ubstitute превращает префикс каждой строки без заголовка во вкладку.Результат на предоставленной вами информации:
Дополнительные объяснения:
:
(двоеточие) - это то, что вы вводите,vi
чтобы начать командуex
-style.%
диапазон адресов вex
. Это означает «применить следующее действие / команду ко всем строкам в буфере (файле)».При использовании с адресом
!
начинается «фильтр» вex
: строки, указанные адресом, подаются в качестве входных данных для указанной внешней команды и заменяются в буфере выходными данными этой команды.-F:
устанавливает разделитель полей Awk.{}
(фигурные скобки) используются в Awk для окружения запускаемых команд. Поскольку нет нет Awk адреса предшествующего фигурных скобок (в кавычках) одиночных, действия в фигурных скобках применяются к каждой строке ввода.a[$1]
создает элемент массива, используя первое поле текущей строки ($1
) в качестве индекса. Поскольку он не говорит= "whatever"
, элемент массива не имеет значения , но это не имеет значения; мы просто хотим, чтобы массив содержал этот элемент.;
завершает эту команду Awk.print
является командой Awk для печати текущей строки (по умолчанию) или любых переданных аргументов (как в последующемprint i
).END
помечает блок действия (в фигурных скобках), который будет выполнен после обработки всего ввода (в Awk).В
for
цикле выводит все индексы массива называетсяa
. Которые являются дедуплицированными первыми полями файла журнала, в произвольном порядке.Так много для команды Awk.
Команда
v
- этоex
команда, противоположная командеg
lobal.g
выполняет действие на всех линиях, соответствующих определенному шаблону.v
выполняет указанное действие на всех строках, НЕ соответствующих данному шаблону./
начинается и заканчивается шаблон. Что только:
в этом случае.m
означает «двигаться». Таким образом,:v/:/m0
invi
перемещает все строки, которые не содержат двоеточий, в начало файла.Остальные команды должны быть довольно понятными. :)
источник
Perl однострочник
источник