2017-02-12 2 views
1

Мне было интересно, какой лучший способ сортировать диаграмму с помощью команды column, чтобы центрировать каждый столбец вместо столбца с выравниванием по умолчанию по умолчанию. Я использовал команду column -t filename.Как использовать «колонку» для центрирования диаграммы?

Выходной ток:

Label1  label2 
Anotherlabel label2442 
label152  label42242 
label78765 label373737737 

Желаемая Выход: Что-то вроде этого

Label1  label2 
Anotherlabel label2442 
    label152  label42242 
label78765 label373737737 

В принципе, я хочу, чтобы быть в центре, а не выравнивается по левому краю.

+0

Возможно, вам придется написать это самостоятельно, используя awk, python или что-то подобное. Я написал это для удовольствия в python здесь: https://gist.github.com/sr105/04063c756db154b5df383892c021a7fb – Harvey

ответ

1

Вот AWK решение:

# Collect all lines in "data", keep track of maximum width for each field 
{ 
    data[NR] = $0 
    for (i = 1; i <= NF; ++i) 
     max[i] = length($i) > max[i] ? length($i) : max[i] 
} 

END { 
    for (i = 1; i <= NR; ++i) { 
     # Split record into array "arr" 
     split(data[i], arr) 
     # Loop over array 
     for (j = 1; j <= NF; ++j) { 
      # Calculate amount of padding required 
      pad = max[j] - length(arr[j]) 
      # Print field with appropriate padding, see below 
      printf "%*s%*s%s", length(arr[j]) + int(pad/2), arr[j], \ 
           pad % 2 == 0 ? pad/2 : int(pad/2) + 1, "", \ 
           j == NF ? "" : " " 
     } 
     # Newline at end of record 
     print "" 
    } 
} 

Вызывается, как это:

$ awk -f centre.awk infile 
    Label1   label2 
Anotherlabel label2442 
    label152  label42242 
label78765 label373737737 

printf оператор использует отступы с динамической шириной:

  • Первый %*s принимает забота левой прокладки и самих данных: arr[j] печатается и дополняется общей шириной length(arr[j]) + int(pad/2).
  • Второй %*s печатает пустую строку, оставляя заполненную половину от общей требуемой прокладки. pad % 2 == 0 ? pad/2 : int(pad/2) + 1 проверяет, было ли общее заполнение четным, а если нет, добавляет дополнительное пространство.
  • Последние %s печатает j == NF ? "" : " ", т. Е. Два пробела, если мы не находимся в последнем поле.

Некоторые старые awks не поддерживает синтаксис %*s, но строка форматирования может быть собран как width = 5; "%" width "s" в этом случае.

0

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

  • Количество число столбцов
  • [опционально] убедитесь, что каждая строка имеет одинаковое количество столбцов
  • фигура из максимальной длины данных для каждого столбца
  • печати каждой строки с помощью макс. длины

.

#!/usr/bin/env python3 

import sys 

def column(): 
    # Read file and split each line into fields (by whitespace) 
    with open(sys.argv[1]) as f: 
     lines = [line.split() for line in f] 
    # Check that each line has the same number of fields 
    num_fields = len(lines[0]) 
    for n, line in enumerate(lines): 
     if len(line) != num_fields: 
      print('Line {} has wrong number of columns: expected {}, got {}'.format(n, num_fields, len(line))) 
      sys.exit(1) 
    # Calculate the maximum length of each field 
    max_column_widths = [0] * num_fields 
    for line in lines: 
     line_widths = (len(field) for field in line) 
     max_column_widths = [max(z) for z in zip(max_column_widths, line_widths)] 
    # Now print them centered using the max_column_widths 
    spacing = 4 
    format_spec = (' ' * spacing).join('{:^' + str(n) + '}' for n in max_column_widths) 
    for line in lines: 
     print(format_spec.format(*line)) 

if __name__ == '__main__': 
    column() 
Смежные вопросы