comando per l'elenco separato dalla scheda layout


39

A volte, sto ricevendo un elenco separato da schede di input, che non è del tutto allineato, ad esempio

var1  var2  var3
var_with_long_name_which_ruins_alignment  var2 var3

C'è un modo semplice per renderli allineati?

var1                                      var2  var3
var_with_long_name_which_ruins_alignment  var2  var3

Qualcuno potrebbe realizzare una soluzione basata su tabstops
Mikel


E un'implementazione Go: golang.org/pkg/tabwriter
Mikel,

16
column -tHai provato a collegarlo a ?
alex,

7
Nascosto alla fine della risposta perl di Mikel è il commento del copertoncino (di Mikel) ... columns -tagisce su uno spazio bianco generale. Per lavorare solo con le schede , utilizzarecolumn -t -s $'\t'
Peter.O

Risposte:


51

Quindi, la risposta diventa:

column -t file_name

Nota che questo divide le colonne in qualsiasi spazio bianco, non solo nelle schede. Se vuoi dividere solo su schede, usa:

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

Gli -s $'\t'insiemi delimitatore linguette solo e -nconserve vuoti colonne (schede adiacenti).

PS: Voglio solo sottolineare che il merito va anche ad Alex . Il suggerimento originale è stato fornito da lui come commento alla domanda, ma non è mai stato pubblicato come risposta.


Aspetterò un po 'che Alex ottenga il merito, penso che se lo meriti. Se non risponderà entro pochi giorni, accetterò una risposta da qualcun altro.
Elazar Leibovich,

Sicuro! Anch'io non ero a conoscenza di column:)
Barun,

1
Questo sembra ideale, ma sfortunatamente columnsembra fallire quando incontra celle vuote. Vedi questo post . A seconda della versione in uso column, potresti essere in grado di specificare l' -nopzione per correggerla.
John J. Camilleri,

Inoltre, questo comando non sarà suddiviso solo sulle schede, ma anche su "qualsiasi spazio". Per dividere solo nelle schede, utilizzare column -t -s $'\t'.
Fritz,

3

Ecco uno script per farlo:

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

uso

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

Uhm, grazie, ma speravo che ci fosse un modo più "portatile" per farlo.
Elazar Leibovich,

Anche a me! Non ne ho trovato uno. pre nlsono i due strumenti di base per la formattazione, e dopo che awk, sed, perl, ecc
Mikel

1
è semplice comecolumn
Elazar Leibovich,

2
@Elzar Excellent! column -t -s $'\t'sembra fare il lavoro.
Mikel,

3

Per le tabulazioni manuali: expand -t 42,48

Per i punti di tabulazione automatici, come suggerito da alex :column -t

( expandè su tutti i sistemi POSIX. columnè un'utilità BSD, disponibile anche in molte distribuzioni Linux.)


1

In seguito al commento di Peter.O che è quello che volevo allineare (dati delimitati da tabulazioni, TSV), questa frase funziona molto bene:

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

Spiegazione:

Sed aggiungerà uno spazio tra i delimitatori vuoti

La colonna aggiungerà una spaziatura uguale tra le colonne

zydsld|asl|asd
das|aosdk|dd

diventa

zydsld|asl  |asd
das   |aosdk|dd 

Meno aprirà l'output in un visualizzatore di file. -N e -S aggiungeranno il numero di riga e disabiliteranno rispettivamente il wrapping


1
Le risposte a una riga spesso non sono le più utili. Valuta di espandere il tuo post per includere la spiegazione della tua soluzione o la documentazione che la supporta.
HalosGhost

0

Con Miller ( http://johnkerl.org/miller/doc ) hai un output di stampa piuttosto.

Correre

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

avere

var1                                     var2 var3
var_with_long_name_which_ruins_alignment var2 var3
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.