команда для компонування вкладки відокремлено список


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
Мікель


І реалізація Go: golang.org/pkg/tabwriter
Мікель

16
Пробували трубопроводити column -t?
alex

7
Захоплений наприкінці відповіді на перманентну відповідь Мікеля - це коментар Clincher (Мікель) ... columns -tдіє на загальний пробіл. Щоб працювати лише з вкладками , використовуйтеcolumn -t -s $'\t'
Peter.O

Відповіді:


51

Отже, відповідь стає:

column -t file_name

Зауважте, що це розділяє стовпці на будь-якому пробілі, а не лише на вкладках. Якщо ви хочете розділити лише вкладки, використовуйте:

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

У -s $'\t'наборах роздільник вкладок тільки і -nзберігає порожні стовпці (сусідні вкладки).

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


Я трохи зачекаю, коли Алекс отримає кредит, я думаю, що він цього заслуговує. Якщо він не відповість через кілька днів, я прийму відповідь від когось іншого.
Елазар Лейбович

Звичайно! Я теж не знав column:)
Барун

1
Це здається ідеальним, але, на жаль, columnздається невдалим, коли він стикається з порожніми клітинками. Дивіться цю публікацію . Залежно від того, яка у columnвас версія , ви, можливо, зможете вказати -nваріант виправити це.
Джон Дж. Каміллері

Крім того, ця команда не тільки розділиться на вкладки, але і на "будь-який пробіл". Щоб розділити лише на вкладки, використовуйте column -t -s $'\t'.
Фріц

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
@Elzar Відмінно! 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

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.