РЕДАКТИРОВАТЬ: Расширяется до любое количество выходных строк в простом однострочном для цикла
:
for ((i=1;i<=2;i++)); do cut -d: -f "$i" input | paste -sd: ; done | column -t -s:
Исходный ответ:
Вы можете сделать это как однострочное, используя замену процесса bash
:
paste -sd: <(cut -d: -f1 input) <(cut -d: -f2 input) | column -t -s:
Параметр -s
для вставки
позволяет обрабатывать каждый файл по одному. Разделитель :
, заданный в вставке
, «перехватывается» параметром -s
в столбце
в конце, чтобы упорядочить формат выстраивая поля в линию.
Команды вырезать
в двух подстановках процесса вытягивают первое поле и второе поле соответственно.
Есть ли во вводе пустые строки или нет, не имеет значения, поскольку column -t -s:
очистит вывод независимо. (В исходном вводе, указанном в вопросе, были пустые строки, но с тех пор они были удалены. Вышеупомянутая команда работает независимо от пустых строк.)
Входные данные - содержимое файла с именем "input" в приведенной выше команде:
Virtual_Machine:OL6U7
ID:0004fb00000600003da8ce6948c441bd
Status:Running
Memory:65536
Uptime:17103
Server:MyOVS1.vmworld.com
Pool:HA-POOL
HA:false
VCPU:16
Type:Xen PVM
OS:Oracle Linux 6
Вывод:
Virtual_Machine ID Status Memory Uptime Server Pool HA VCPU Type OS
OL6U7 0004fb00000600003da8ce6948c441bd Running 65536 17103 MyOVS1.vmworld.com HA-POOL false 16 Xen PVM Oracle Linux 6
sed 's/[^.]*$/txt/'
Или сделать это только для строк, содержащих хотя бы один.
(не менять myfile
наtxt
):
sed 's/\.[^.]*$/.txt/'
Чтобы также избежать замены .bashrc
на.txt
:
sed 's/\(..*\.\).*/\1txt/'
(на этот раз мы полагаемся на жадность .*
заменить часть после последней.
).
Чтобы также не заменять foo.d/myfile
наfoo.txt
:
sed 's|\([^/]\.\)[^./]*$|\1txt|'
Чтобы также добавить расширение .txt
к файлам, которые не имеют расширения (, включая изменение .bashrc
на .bashrc.txt
, но не касаясь пустых строк и строк, оканчивающихся на/
):
sed 's|\([^/]\)\.[^./]*$|\1|;s|[^/]$|&.txt|'