Рейтинг:0

Чистый анализ столбца из вывода команды bash

флаг ng

Нам нужно извлечь столбец из вывода команды. Я пробовал методы с использованием команд awk и cut. Принимая во внимание, что у нас есть пробелы в значениях 2-го столбца, из-за которых разделитель для пробела или другого символа неправильно анализирует вывод 2-го столбца. Есть ли у нас другой способ получить чисто второй столбец вывода, как указано выше?

# информация о коте.txt
Файл имени Vmid                                 
369 DO-NOT-DELL [datastore1] DO-NOT-DELL/DO-NOT-DELL.vmx                                
389 VMware vCenter Server [datastore1] VMware vCenter Server/VMware vCenter Server.vmx            
390 Auth-vcenter-Не удалять [datastore1] Auth-vcenter-Не удалять/Auth-vcenter-Не удалять.vmx    
393 VirtualMachine [datastore1] VirtualMachine/VirtualMachine.vmx                                            
9 Server 2005 для ВМ (группа разработчиков) [datastore1] Server 2005 для ВМ (группа разработчиков)      

# информация о коте.txt | awk '{напечатать $2}'
НЕ ДЕЛЛ
VMware
Auth-vcenter-Не
Виртуальная машина
Сервер

Как и в приведенном выше выводе второго столбца, у нас нет полного значения, как в исходном файле.

Рейтинг:4
флаг us

Можно разобрать столбцы фиксированной ширины с GNU awk:

Разбиение входной записи на поля фиксированной ширины задается путем присвоения встроенной переменной строки, содержащей числа, разделенные пробелами. ШИРИНА ПОЛЯ. Каждое число указывает ширину поля, включая столбцы между полями. Если вы хотите игнорировать столбцы между полями, вы можете указать ширину как отдельное поле, которое впоследствии будет игнорироваться.

% awk -v FIELDWIDTHS="7 37 *" '{print $2}' foo
   Имя                              
НЕ ДЕЛЛ                          
Сервер VMware vCenter                
Auth-vcenter-не удалять            
Виртуальная машина                       
Server 2005 для ВМ (команда разработчиков)        

Вы также можете использовать регулярное выражение в качестве разделителя полей для разделения текста, например, используя 3 или более пробелов в качестве FS:

% awk -F '{3,}' '{print $2}' foo
Имя
НЕ ДЕЛЛ
Сервер VMware vCenter
Auth-vcenter-не удалять
Виртуальная машина
Server 2005 для ВМ (команда разработчиков)
cybermizz avatar
флаг ng
Большое спасибо @muru
bac0n avatar
флаг cn
`'NR>1 {print $2}'`, пропускает заголовок.
Рейтинг:1
флаг ng

Я также нашел хороший способ получить список виртуальных машин от одного из моих друзей.

# информация о коте.txt | тр -с " " | вырезать -d "[" -f1 | вырезать -d " " -f2- | хвост -n +2

                        
НЕ ДЕЛЛ                          
Сервер VMware vCenter                
Auth-vcenter-не удалять            
Виртуальная машина                       
Server 2005 для ВМ (команда разработчиков)  
Рейтинг:1
флаг cn

Преобразование пробелов в табуляции с нестандартными позициями табуляции:

unexpand -t 7,44 info.txt | вырезать -f2
elmclose avatar
флаг cn
Отличное решение. Я узнал кое-что новое: unexpand
Рейтинг:0
флаг cn

В качестве разделителя полей awk можно использовать несколько пробелов между «столбцами». Это можно сделать с помощью регулярного выражения как [ ]{2,}

$ awk -F"[ ]{2,}" '{print $1}'
Вмид
369
389
390
393
9

$ awk -F"[ ]{2,}" '{print $2}'
Имя
НЕ ДЕЛЛ
Сервер VMware vCenter
Auth-vcenter-не удалять
Виртуальная машина
Server 2005 для ВМ (команда разработчиков)

$ awk -F"[ ]{2,}" '{print $3}'
Файл
[datastore1] DO-NOT-DELL/DO-NOT-DELL.vmx
[datastore1] VMware vCenter Server/VMware vCenter Server.vmx
[datastore1] Auth-vcenter-не удалять/Auth-vcenter-не удалять.vmx
[datastore1] Виртуальная машина/Виртуальная машина.vmx
[datastore1] Server 2005 для ВМ (команда разработчиков)
terdon avatar
флаг cn
Ваша версия info.txt | awk '{$NF=""; напечатать $0}' | оборот | sed 's/\[/SEP\[/g' | awk 'BEGIN{FS="SEP"} {print $1}'` напечатает `Name File` в качестве первой строки. Остальные, похоже, производят что-то другое, чем то, о чем просил ОП.

Ответить или комментировать

Большинство людей не понимают, что склонность к познанию нового открывает путь к обучению и улучшает межличностные связи. В исследованиях Элисон, например, хотя люди могли точно вспомнить, сколько вопросов было задано в их разговорах, они не чувствовали интуитивно связи между вопросами и симпатиями. В четырех исследованиях, в которых участники сами участвовали в разговорах или читали стенограммы чужих разговоров, люди, как правило, не осознавали, что задаваемый вопрос повлияет — или повлиял — на уровень дружбы между собеседниками.