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

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.


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

Ä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


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

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


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
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.