Befehl zum Layout tab getrennt Liste schön

39

Manchmal erhalte ich als Eingabe-Tab eine getrennte Liste, die zum Beispiel nicht ganz ausgerichtet ist

var1  var2  var3
var_with_long_name_which_ruins_alignment  var2 var3

Gibt es eine einfache Möglichkeit, sie auszurichten?

var1                                      var2  var3
var_with_long_name_which_ruins_alignment  var2  var3
Elazar Leibovich
quelle
Jemand könnte eine Lösung basierend auf elastischen Tabstops finden: nickgravgaard.com/elastictabstops
Mikel
Und eine Go-Implementierung: golang.org/pkg/tabwriter
Mikel
16
Versucht es zu leiten column -t?
alex
7
Am Ende der Perl-Antwort von Mikel verbirgt sich der Clincher-Kommentar (von Mikel) ... columns -tder sich auf allgemeine Leerzeichen bezieht . Verwenden Siecolumn -t -s $'\t'
Peter.O

Antworten:

51

Die Antwort lautet also:

column -t file_name

Beachten Sie, dass dies Spalten in beliebigen Leerzeichen aufteilt, nicht nur Tabulatoren. Wenn Sie nur auf Registerkarten teilen möchten, verwenden Sie:

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

Das -s $'\t'setzt das Trennzeichen nur auf Tabulatoren und -nbehält leere Spalten (benachbarte Tabulatoren) bei.

PS: Ich möchte nur darauf hinweisen, dass der Kredit auch an Alex geht . Der ursprüngliche Hinweis wurde von ihm als Kommentar zur Frage bereitgestellt, aber nie als Antwort gepostet.

Barun
quelle
Ich werde ein bisschen warten, bis Alex die Gutschrift bekommt, ich denke, er hat es verdient. Wenn er in ein paar Tagen nicht antworten würde, würde ich eine Antwort von jemand anderem annehmen.
Elazar Leibovich
Sicher! Ich war auch nicht bewusst column:)
Barun
1
Dies scheint ideal zu sein, aber es columnscheint leider zu scheitern, wenn es auf leere Zellen stößt. Siehe diesen Beitrag . Je nachdem, über welche Version columnSie verfügen, können Sie möglicherweise die -nOption zur Korrektur angeben .
John J. Camilleri
Außerdem wird dieser Befehl nicht nur auf Registerkarten aufgeteilt, sondern auch auf "beliebige Leerzeichen". Verwenden Sie, um nur auf Registerkarten zu teilen column -t -s $'\t'.
Fritz
3

Hier ist ein Skript, um es zu tun:

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

Verwendungszweck

$ aligntabs.pl < infile
var1                                     var2 var3
var_with_long_name_which_ruins_alignment var2 var3
Mikel
quelle
Ähm, danke, aber ich hatte gehofft, dass es einen "portableren" Weg gibt, das zu tun.
Elazar Leibovich
Ich auch! Konnte keinen finden. prund nlsind die zwei grundlegenden Werkzeuge für die Formatierung und danach awk, sed, perletc.
Mikel
1
Es ist so einfach wiecolumn
Elazar Leibovich
2
@Elzar Ausgezeichnet! column -t -s $'\t'scheint den Job zu machen.
Mikel
3

Für manuelle Tabulatoren: expand -t 42,48

Für automatische Tabstopps, wie von alex vorgeschlagen :column -t

( expandIst auf allen POSIX-Systemen verfügbar. columnIst ein BSD-Dienstprogramm, das auch in vielen Linux-Distributionen verfügbar ist.)

Gilles 'SO - hör auf böse zu sein'
quelle
1

Nach dem Kommentar von Peter.O, den ich ausrichten wollte (tabulatorgetrennte Daten, TSV), funktioniert dieser Satz sehr gut:

column -t -s $'\t' /Users/me/data.csv | less --chop-long-lines
Sridhar Sarnobat
quelle
0
sed 's/||/| |/g;s/||/| |/g' filename-here | column -s"|" -t | less -#2 -N -S

Erläuterung:

Sed fügt ein Leerzeichen zwischen Leerzeichen ein

Die Spalte fügt den gleichen Abstand zwischen den Spalten hinzu

zydsld|asl|asd
das|aosdk|dd

wird

zydsld|asl  |asd
das   |aosdk|dd 

Less öffnet die Ausgabe in einem Datei-Viewer. -N und -S fügen die Zeilennummer hinzu und deaktivieren den Zeilenumbruch

Rohit
quelle
1
Einzeilige Antworten sind oft nicht die hilfreichsten. Erwägen Sie, Ihren Beitrag um eine Erläuterung Ihrer Lösung oder eine Dokumentation zu erweitern, die dies unterstützt.
HalosGhost
0

Mit Miller ( http://johnkerl.org/miller/doc ) haben Sie eine schöne Druckausgabe.

Lauf

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

haben

var1                                     var2 var3
var_with_long_name_which_ruins_alignment var2 var3
Aborruso
quelle