düzen sekmesine komut güzelce ayrılmış liste


39

Bazen, örneğin tam olarak hizalanmamış bir giriş sekmesi ayrılmış listesi olarak alıyorum.

var1  var2  var3
var_with_long_name_which_ruins_alignment  var2 var3

Onları hizalamanın kolay bir yolu var mı?

var1                                      var2  var3
var_with_long_name_which_ruins_alignment  var2  var3

Birisi elastik tablalara dayanarak bir çözüm yapabilir: nickgravgaard.com/elastictabstops
Mikel


Ve bir Go uygulaması: golang.org/pkg/tabwriter
Mikel

16
Boruyu denediniz mi column -t?
alex,

7
Mikel'in Perl cevabının sonunda sıkışmış katil yorumudur (Mikel tarafından) ... columns -tgenel beyaz boşluk üzerinde hareket eder. Sadece sekmelerle çalışmak için ,column -t -s $'\t'
Peter.O

Yanıtlar:


51

Böylece, cevap olur:

column -t file_name

Bunun yalnızca sekmelerde değil , herhangi bir boşlukta da sütunlara bölündüğünü unutmayın . Yalnızca sekmelerde bölmek istiyorsanız, şunu kullanın:

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

-s $'\t'Setleri sekme ayraç yalnızca -nkorur boş kolonları (bitişik uçları).

Not: Sadece kredinin Alex'e gittiğini belirtmek istiyorum . Asıl ipucu onun tarafından soruya yorum olarak verildi, ancak hiçbir zaman cevap olarak gönderilmedi.


Alex'in krediyi alması için biraz bekleyeceğim, sanırım haketti. Birkaç gün içinde cevap vermezse, başka birinin yanıtını kabul edeceğim.
Elazar Leibovich

Elbette! Ben de haberi yoktu column:)
Barun

1
Bu ideal görünüyor ama ne yazık columnki boş hücrelerle karşılaştığında başarısız görünüyor. Bu gönderiye bakınız . Hangi sürüme sahip columnolduğunuza bağlı olarak , bunu -ndüzeltme seçeneğini belirleyebilirsiniz.
John J. Camilleri

Ayrıca, bu komut yalnızca sekmelerde değil, "herhangi bir boşlukta" da bölünecektir. Sadece sekmelerde bölmek için kullanın column -t -s $'\t'.
Fritz,

3

İşte bunu yapmak için bir komut dosyası:

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

kullanım

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

Teşekkürler, ama bunu yapmanın daha taşınabilir bir yolu olduğunu umuyordum.
Elazar Leibovich

Ben de! Bir tane bulunamadı. prve nlbiçimlendirme için iki temel araçlardır ve bundan sonra awk, sed, perlvb
Mikel

1
kadar basitcolumn
Elazar Leibovich

2
@Elzar Mükemmel! column -t -s $'\t'işi yapmak gibi görünüyor.
Mikel

3

Manuel sekme durakları için: expand -t 42,48

Alex tarafından önerildiği gibi otomatik sekme durakları için :column -t

( expandtüm POSIX sistemlerinde columnbulunmaktadır. birçok Linux dağıtımında da kullanılabilen bir BSD yardımcı programıdır.)


1

Peter.O'nun hizalamak istediğim yorumundan sonra (sekmeyle ayrılmış veriler, TSV), bu ifade çok güzel çalışıyor:

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

Açıklama:

Sed boş sınırlayıcılar arasına boşluk ekler

Sütun, sütunlar arasında eşit boşluk katacak

zydsld|asl|asd
das|aosdk|dd

olur

zydsld|asl  |asd
das   |aosdk|dd 

Daha az çıktı bir dosya görüntüleyicide açılacaktır. -N ve -S, satır numarası ekleyecek ve sırasıyla ambalajlamayı devre dışı bırakacaktır.


1
Tek satırlık cevaplar çoğu zaman en yararlı değildir. Çözümünüzün açıklamasını veya onu destekleyen belgeleri içerecek şekilde yayınınızı genişletmeyi düşünün.
HalosGhost

0

Miller ile ( http://johnkerl.org/miller/doc ) hoş bir baskı çıktınız var.

Çalıştırmak

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

sahip olmak

var1                                     var2 var3
var_with_long_name_which_ruins_alignment var2 var3
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.