У меня есть файл, который содержит информацию о виртуальных машинах, работающих в гипервизоре. Мы запускаем некоторую команду и перенаправляем вывод в файл. И данные доступны в следующем формате.
Virtual Machine : OL6U5
ID : 0004fb00000600003da8ce6948c441bb
Status : Running
Memory : 65536
Uptime : 17835 Minutes
Server : MyOVS1.vmorld.com
Pool : HA-POOL
HA Mode: false
VCPU : 16
Type : Xen PVM
OS : Oracle Linux 6
Virtual Machine : OL6U6
ID : 0004fb00000600003da8ce6948c441bc
Status : Running
Memory : 65536
Uptime : 17565 Minutes
Server : MyOVS2.vmorld.com
Pool : NON-HA-POOL
HA Mode: false
VCPU : 16
Type : Xen PVM
OS : Oracle Linux 6
Virtual Machine : OL6U7
ID : 0004fb00000600003da8ce6948c441bd
Status : Running
Memory : 65536
Uptime : 17835 Minutes
Server : MyOVS1.vmorld.com
Pool : HA-POOL
HA Mode: false
VCPU : 16
Type : Xen PVM
OS : Oracle Linux 6
Этот вывод отличается от гипервизора к гипервизору, поскольку на некоторых гипервизорах у нас работает 50+ vms. Выше файл является просто примером из гипервизора, где у нас работает только 3 виртуальные машины, и, следовательно, перенаправленный файл должен содержать информацию о нескольких (N количество виртуальных машин)
Нам нужно получить эту информацию в следующем формате, используя awk / sed или сценарий оболочки
Virtual_Machine ID Status Memory Uptime Server Pool HA VCPU Type OS
OL6U5 0004fb00000600003da8ce6948c441bb Running 65536 17835 MyOVS1.vmworld.com HA-POOL false 16 Xen PVM Oracle Linux 6
OL6U6 0004fb00000600003da8ce6948c441bc Running 65536 17565 MyOVS2.vmworld.com NON-HA-POOL false 16 Xen PVM Oracle Linux 6
OL6U5 0004fb00000600003da8ce6948c441bd Running 65536 17835 MyOVS1.vmworld.com HA-POOL false 16 Xen PVM Oracle Linux 6
text-processing
sed
awk
IgniteLX
источник
источник
Ответы:
Если обход файла дважды не является (большой) проблемой (в памяти будет храниться только одна строка):
Который для общего количества полей будет (который может иметь много прогулок по файлу):
Но для действительно общего транспонирования это будет работать:
И сделать это красиво (используя табуляцию
\t
как разделитель полей):Приведенный выше код для общей транспонирования сохранит всю матрицу в памяти.
Это может быть проблемой для действительно больших файлов.
Обновление для нового текста.
Чтобы обработать новый текст, размещенный в вопросе, мне кажется, что два прохода awk - лучший ответ. Один проход, так как поля существуют, напечатает заголовки полей заголовка. При следующем проходе awk будет напечатано только поле 2. В обоих случаях я добавил способ удаления начальных и конечных пробелов (для лучшего форматирования).
Окружение
{ ... } | column -t -s "$(printf '%b' '\t')"
состоит в том, чтобы отформатировать всю таблицу красивым способом.Обратите внимание, что их
"$(printf '%b' '\t')"
можно заменить$'\t'
на ksh, bash или zsh.источник
Если у вас есть
rs
утилита (изменить форму) , вы можете сделать следующее:Это дает формат вывода точно так, как указано в вопросе, даже вплоть до динамической ширины столбца.
-T
Транспонирует входные данные-z
размеры столбцов соответственно от максимума в каждом столбце-c:
использует двоеточие в качестве разделителя поля вводаЭто работает для таблиц произвольного размера, например:
rs
доступно по умолчанию на OS X (и, вероятно, на других машинах BSD). Его можно установить в Ubuntu (и семействе Debian) с помощью:источник
РЕДАКТИРОВАТЬ: Расширяемый на любое количество выходных строк, в простой однострочный
for
цикл:Оригинальный ответ:
Вы можете сделать это как однострочник, используя
bash
подстановку процесса:-s
Вариантpaste
делает его обрабатывать каждый файл по одному. Установленный:
разделительpaste
«пойман»-s
опциейcolumn
в конце, чтобы привести в порядок формат, выровняв поля.Эти
cut
команды в двух технологических замен вытащить первое поле и второе поле, соответственно.Есть ли пустые строки на входе или нет, не имеет значения, так как
column -t -s:
очистит вывод независимо. (В исходном вводе, указанном в вопросе, были пустые строки, но с тех пор они были удалены. Приведенная выше команда работает независимо от пустых строк.)Input - содержимое файла с именем «input» в приведенной выше команде:
Вывод:
источник
Используя awk, сохраните ключ и значение и распечатайте их в конце.
Просто запустить
awk -f ./script.awk ./input.txt
источник
источник
С
gnu datamash
иcolumn
изutil-linux
:Это работает с более чем двумя столбцами, но предполагает, что во входном файле нет пустых строк; с пустыми строками между ними (как в исходном входном примере) вы получите ошибку вроде:
так что во избежание этого вам придется сжать их перед обработкой
datamash
:В противном случае, в данном конкретном случае (только два столбца), с
zsh
и одинаковымиcolumn
:(${(f)"$(<infile)"})
читает строки в массиве;${(j;:;)list[@]%:*}
объединяет (с:
) первое поле каждого элемента и${(j;:;)list[@]#*:}
объединяет (снова с:
) второе поле каждого элемента; они оба напечатаны, например, выводкоторый затем направляется в
column -t -s:
источник
cat <(head -n 11 virtual.txt | cut -d: -f1) <(sed 's/.*: //' virtual.txt) | xargs -d '\n' -n 11 | column -t
Количество строк на виртуальную машину в этом случае жестко закодировано - 11. Лучше заранее подсчитать ее и сохранить в переменной, затем использовать эту переменную в коде.
объяснение
cat <(command 1) <(command 2)
-<()
конструкция делаетcommand
вывод похожим на временный файл. Следовательно,cat
объединяет два файла и передает его дальше.head -n 11 virtual.txt | cut -d: -f1
дает нам будущие заголовки столбцов. Одна запись виртуальной машины состоит из первых одиннадцати строк,head
для ее получения используется команда.cut
Разделяет эту запись на две колонки и напечатать только первый.sed 's/.*: //' virtual.txt
- дает нам будущие значения столбца.sed
удаляет весь ненужный текст и оставляет только значения.xargs -d '\n' -n 11
, Каждый элемент ввода завершается символом новой строки. Эта команда получает элементы и печатает их по 11 на строку.column -t
- необходим для красивой печати дисплеев. Он отображает наши строки в виде таблицы. В противном случае каждая строка будет разной ширины.Вывод
источник
Используйте
datamash
и егоtranspose
опцию, чтобы поменять строки и столбцы в файле.По умолчанию, транспонирование проверяет, что вход имеет одинаковое количество полей в каждой строке, в противном случае происходит ошибка с ошибкой, и вы можете отключить ее строгий режим, чтобы пропустить значения путем
--no-strict
Также вы можете использовать
--filler
для установки значения заполнителя отсутствующего поля:полученный из
datamash manual
источник
если ваши данные находятся в отдельных файлах в каталоге, вы можете использовать:
вам может потребоваться изменить количество
\t
символов (табуляции) вprintf
строке, если значения переменных имеют разную длину.источник