команда на вкладке макета разделенный список красиво


39

Иногда, я получаю как разделенный вкладкой список, который не совсем выровнен, например

var1  var2  var3
var_with_long_name_which_ruins_alignment  var2 var3

Есть ли простой способ сделать их выровненными?

var1                                      var2  var3
var_with_long_name_which_ruins_alignment  var2  var3

Кто-то может сделать решение, основанное на упругих закладках: nickgravgaard.com/elastictabstops
Mikel


И реализация Go: golang.org/pkg/tabwriter
Микель,

16
Пробовал обвязывать column -t?
Алекс

7
В конце perl-ответа Микеля спрятан самый решительный комментарий (автором по Майклу) ... columns -tдействующий в общем пробеле. Для работы только с вкладками используйтеcolumn -t -s $'\t'
Peter.O 20.02.11

Ответы:


51

Итак, ответ становится:

column -t file_name

Обратите внимание, что это разделяет столбцы в любом пустом месте, а не только на вкладках. Если вы хотите разделить только на вкладки, используйте:

column -t -s $'\t' -n file_name

В -s $'\t'наборах разделитель вкладок только и -nсохраняет пустые столбцы (соседние вкладки).

PS: Просто хочу отметить, что заслуга также принадлежит Алексу . Первоначальная подсказка была предоставлена ​​им в качестве комментария к вопросу, но не была опубликована в качестве ответа.


Я подожду немного, чтобы Алекс получил кредит, думаю, он этого заслуживает. Если он не ответит через несколько дней, я приму ответ от кого-то еще.
Элазар Лейбович

Конечно! Я тоже не знал column:)
Barun

1
Это кажется идеальным, но, к сожалению, columnкажется, что терпит неудачу, когда сталкивается с пустыми клетками. Смотрите этот пост . В зависимости от того, какая у columnвас версия , вы можете указать -nвозможность исправить это.
Джон Дж. Камиллери

Кроме того, эта команда будет разделяться не только на вкладки, но и на «любой пробел». Чтобы разделить только на вкладках, используйте column -t -s $'\t'.
Fritz

3

Вот скрипт для этого:

aligntabs.pl

#!/usr/bin/perl

my $delim = '\s*\t\s*';

my %length = ();
my @lines = ();
for my $line (<>) {
    chomp $line;
    my @words = split $delim, $line;
    my $numwords = scalar(@words);
    for my $i (0..$numwords-1) {
        my $maxlen = $length{$i} // 0;
        my $thislen = length($words[$i]);
        $maxlen = ($thislen > $maxlen)? $thislen: $maxlen;
        $length{$i} = $maxlen;
    }
    push @lines, [@words];
}

foreach my $wordsref (@lines) {
    my @words = @$wordsref;
    my $numwords = scalar(@words);
    for my $i (0..$numwords-1) {
        if ($i < $numwords-1) {
            my $fieldlen = $length{$i};
            printf "%-${fieldlen}s ", $words[$i];
        }
        else {
            print $words[$i];
        }
    }
    print "\n";
}

использование

$ aligntabs.pl < infile
var1                                     var2 var3
var_with_long_name_which_ruins_alignment var2 var3

Хм, спасибо, но я надеялся, что есть более «портативный» способ сделать это.
Элазар Лейбович

Я тоже! Не могу найти. prи nlявляются двумя основными инструментами для форматирования, и после этого awk, sed, perlи т.д.
Микель

1
это так же просто, какcolumn
Элазар Лейбович

2
@ Эльзар Отлично! column -t -s $'\t'кажется, делает работу.
Микель

3

Для ручного табуляции: expand -t 42,48

Для автоматической остановки табуляции, как предложено alex :column -t

( expandимеется во всех системах POSIX. columnЭто утилита BSD, также доступная во многих дистрибутивах Linux.)


1

Следуя комментарию Peter.O, который я хотел выровнять (данные с разделителями табуляции, TSV), эта фраза работает очень хорошо:

column -t -s $'\t' /Users/me/data.csv | less --chop-long-lines

0
sed 's/||/| |/g;s/||/| |/g' filename-here | column -s"|" -t | less -#2 -N -S

Объяснение:

Sed добавит пробел между пустыми разделителями

Столбец добавит одинаковое расстояние между столбцами

zydsld|asl|asd
das|aosdk|dd

становится

zydsld|asl  |asd
das   |aosdk|dd 

Меньше откроет вывод в просмотрщике файлов. -N и -S добавят номер строки и отключат перенос соответственно


1
Ответы в одну строку часто не самые полезные. Подумайте о расширении своего поста, включив в него объяснение вашего решения или документацию, которая его поддерживает.
HalosGhost

0

С Миллером ( http://johnkerl.org/miller/doc ) у вас есть хороший вывод на печать.

Бег

mlr --inidx --ifs "\t" --opprint cat input | tail -n +2

иметь

var1                                     var2 var3
var_with_long_name_which_ruins_alignment var2 var3
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.