Создание столбцов из текстового вывода, но с несколькими столбцами слов

У меня есть следующий вывод:

Person 49 Persons Boss 3 HR 21 CEO 93 System Administrator 2 

Использование column -t дает следующий результат:

 Person 49 Persons Boss 3 HR 21 CEO 93 System Administrator 2 

как вы видите, это выглядит не очень хорошо. Мне нужен вывод, чтобы он выглядел так:

 Person 49 Persons Boss 3 HR 21 CEO 93 System Administrator 2 

Кто-нибудь знает, как это можно сделать?

Вы можете сделать это с помощью одного лайнера, сохранив последнюю поданную в новую переменную, а затем установите для нее исходный указатель на пустую строку, а затем напечатайте переменную $ 0 и last-filed, которую вы сохранили.

 (echo abc 10; echo xy 2 ; echo x 1) \ | awk '{lastf=$NF ; $NF="" ; print $0,", "lastf}' \ | column -ts, # output abc 10 xy 2 x 1 

Измените разделитель столбцов на, например, Tab, чем column использования:

 output | sed 's/\S\+\s*$/\t&/' | column -t -s $'\t' 

Вот решение в awk, которое динамически определяет требуемые ширины столбцов. Он может принимать любое количество полей в каждой строке, но предполагает, что конечное поле является целым числом. Целые числа форматируются для выравнивания справа, по желанию.

format.awk

 #!/usr/bin/awk -f # Format text and numbers into two columns # Written by PM 2Ring 2015.04.16 #Gather data, line by line { #Split name from number match($0, /^(.*) ([0-9]+)[[:space:]]*$/, a) #printf "%d: %s -> [%s] [%s]\n", NR, $0, a[1], a[2] #Store name & number into arrays name[NR] = a[1] num[NR] = a[2] #Update field widths namelen = length(a[1]) if (namelen > maxname) maxname = namelen numlen = length(a[2]) if (numlen > maxnum) maxnum = numlen } #Print re-formatted data END{ for(i=1; i<=NR; i++) #Use printf's '*' modifier to specify field widths printf "%-*s %*d\n", maxname, name[i], maxnum, num[i] } 

вывод

 Person 49 Persons Boss 3 HR 21 CEO 93 System Administrator 2 

Вы можете вызвать скрипт следующим образом:

$ awk -f format.awk data_filename

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

Очевидно, что это немного сложнее, чем решение Costa, которое использует sed для предварительной обработки ввода в column . Поэтому я бы предложил использовать это, если вы действительно не хотите, чтобы цифры были правильно обоснованы. 🙂 OTOH, хотя этот скрипт выглядит больше, чем один лайнер Коста, awk очень быстро, поэтому я ожидаю, что это решение будет сравнимо по скорости с Коста, даже с действительно большими файлами данных.