polecenie, aby ładnie oddzielić listę kart


39

Czasami dostaję listę rozdzielanych tabulatorami wejściowymi, która nie jest na przykład całkiem wyrównana

var1  var2  var3
var_with_long_name_which_ruins_alignment  var2 var3

Czy istnieje prosty sposób, aby wyrównać je?

var1                                      var2  var3
var_with_long_name_which_ruins_alignment  var2  var3

Ktoś mógłby stworzyć rozwiązanie w oparciu o elastyczne tabstopsy: nickgravgaard.com/elastictabstops
Mikel


I wdrożenie Go: golang.org/pkg/tabwriter
Mikel

16
Próbowałeś to zrobić column -t?
alex

7
Na końcu odpowiedzi na perla Mikela schowany jest komentarz klinkiera (Mikela) ... columns -tdziała na ogólną spację. Aby pracować tylko z kartami , użyjcolumn -t -s $'\t'
Peter.O

Odpowiedzi:


51

Tak więc odpowiedź brzmi:

column -t file_name

Pamiętaj, że powoduje to podział kolumn w dowolnym miejscu spacji, a nie tylko na kartach. Jeśli chcesz podzielić tylko na zakładki, użyj:

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

Te -s $'\t'zestawy ogranicznik wypustkom tylko i -nkonserwy puste słupki (sąsiednich łap).

PS: Chcę tylko podkreślić, że kredyt należy się również Alexowi . Oryginalna wskazówka została podana przez niego jako komentarz do pytania, ale nigdy nie została opublikowana jako odpowiedź.


Poczekam trochę, aż Alex dostanie kredyt, myślę, że na to zasługuje. Jeśli nie odpowie za kilka dni, przyjmuję odpowiedź od kogoś innego.
Elazar Leibovich,

Pewnie! Ja też nie byłem świadomy column:)
Barun

1
To wydaje się idealne, ale niestety columnwydaje się zawieść, gdy napotka puste komórki. Zobacz ten post . W zależności od posiadanej wersji columnmożesz określić -nopcję rozwiązania tego problemu.
John J. Camilleri,

Również to polecenie nie tylko podzieli się na tabulatory, ale także na „dowolne białe znaki”. Aby podzielić tylko na zakładki, użyj column -t -s $'\t'.
Fritz

3

Oto skrypt, aby to zrobić:

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";
}

stosowanie

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

Dzięki, ale miałem nadzieję, że istnieje bardziej „przenośny” sposób na zrobienie tego.
Elazar Leibovich

Ja też! Nie mogłem znaleźć. pri nlsą dwa podstawowe narzędzia do formatowania, a potem awk, sed, perl, itd.
Mikel

1
to tak proste, jakcolumn
Elazar Leibovich

2
@Elzar Excellent! column -t -s $'\t'zdaje się wykonywać pracę.
Mikel

3

W przypadku ręcznych tabulatorów: expand -t 42,48

Automatyczne tabulatory, jak sugeruje Alex :column -t

( expandjest na wszystkich systemach POSIX. columnjest narzędziem BSD, dostępnym również w wielu dystrybucjach Linuksa).


1

Zgodnie z komentarzem Peter.O, który chciałem wyrównać (dane rozdzielane tabulatorami, TSV), to zdanie działa bardzo ładnie:

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

Wyjaśnienie:

Sed doda spację między pustymi ogranicznikami

Kolumna doda równe odstępy między kolumnami

zydsld|asl|asd
das|aosdk|dd

staje się

zydsld|asl  |asd
das   |aosdk|dd 

Mniej otworzy dane wyjściowe w przeglądarce plików. -N i -S dodają odpowiednio numer linii i wyłączają zawijanie


1
Odpowiedzi jednowierszowe często nie są najbardziej pomocne. Rozważ rozwinięcie swojego postu, aby zawierał wyjaśnienie rozwiązania lub dokumentację, która je obsługuje.
HalosGhost,

0

Dzięki Millerowi ( http://johnkerl.org/miller/doc ) masz całkiem niezłą wydruk.

Biegać

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

mieć

var1                                     var2 var3
var_with_long_name_which_ruins_alignment var2 var3
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.