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.