perintah untuk tata letak daftar tab dipisahkan dengan baik

39

Kadang-kadang, saya mendapatkan daftar terpisah sebagai input tab, yang tidak cukup selaras, misalnya

var1  var2  var3
var_with_long_name_which_ruins_alignment  var2 var3

Apakah ada cara mudah untuk membuat mereka selaras?

var1                                      var2  var3
var_with_long_name_which_ruins_alignment  var2  var3
Elazar Leibovich
sumber
Seseorang dapat membuat solusi berdasarkan tabstop elastis: nickgravgaard.com/elastictabstops
Mikel
Dan implementasi Go: golang.org/pkg/tabwriter
Mikel
16
Sudah mencoba mengirimnya column -t?
alex
7
Terselip di akhir jawaban perl Mikel adalah komentar penentu (oleh Mikel) ... columns -tbertindak pada spasi umum. Untuk bekerja dengan tab saja , gunakancolumn -t -s $'\t'
Peter.O

Jawaban:

51

Jadi jawabannya menjadi:

column -t file_name

Perhatikan bahwa ini memecah kolom di spasi putih apa pun , bukan hanya tab. Jika Anda ingin membagi hanya pada tab, gunakan:

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

The -s $'\t'set pembatas untuk tab saja dan -nmempertahankan kosong kolom (tab yang berdekatan).

PS: Hanya ingin menunjukkan bahwa kreditnya juga untuk Alex . Petunjuk asli diberikan olehnya sebagai komentar untuk pertanyaan, tetapi tidak pernah diposting sebagai jawaban.

Barun
sumber
Saya akan menunggu sedikit untuk Alex untuk mendapatkan kredit, saya pikir dia layak mendapatkannya. Jika dia tidak akan menjawab dalam beberapa hari saya akan menerima jawaban dari orang lain.
Elazar Leibovich
Yakin! Saya juga tidak mengetahui column:)
Barun
1
Ini tampaknya ideal tetapi sayangnya columntampaknya gagal ketika menemukan sel-sel kosong. Lihat posting ini . Tergantung pada versi yang columnAnda miliki, Anda mungkin dapat menentukan -nopsi untuk memperbaikinya.
John J. Camilleri
Juga, perintah ini tidak hanya akan terpecah pada tab, tetapi juga pada "spasi kosong". Untuk membagi hanya pada tab, gunakan column -t -s $'\t'.
Fritz
3

Berikut ini skrip untuk melakukannya:

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

pemakaian

$ aligntabs.pl < infile
var1                                     var2 var3
var_with_long_name_which_ruins_alignment var2 var3
Mikel
sumber
Um, terima kasih, tapi saya berharap ada cara yang lebih "portabel" untuk melakukan itu.
Elazar Leibovich
Saya juga! Tidak dapat menemukannya. prdan nladalah dua alat dasar untuk format, dan setelah itu awk, sed, perl, dll
Mikel
1
sesederhanacolumn
Elazar Leibovich
2
@ Elzar Sangat Baik! column -t -s $'\t'tampaknya melakukan pekerjaan itu.
Mikel
3

Untuk penghentian tab manual: expand -t 42,48

Untuk penghentian tab otomatis, seperti yang disarankan oleh alex :column -t

( expandada di semua sistem POSIX. columnadalah utilitas BSD, tersedia di banyak distribusi Linux juga.)

Gilles 'SANGAT berhenti menjadi jahat'
sumber
1

Sebagai lanjutan dari komentar Peter.O yang ingin saya selaraskan (tab delimited data, TSV), frasa ini bekerja dengan sangat baik:

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

Penjelasan:

Sed akan menambahkan spasi di antara pembatas kosong

Kolom akan menambahkan jarak yang sama antara kolom

zydsld|asl|asd
das|aosdk|dd

menjadi

zydsld|asl  |asd
das   |aosdk|dd 

Less akan membuka output di penampil file. -N dan -S akan menambahkan nomor baris dan menonaktifkan pembungkus masing-masing

Rohit
sumber
1
Jawaban satu baris seringkali bukan yang paling bermanfaat. Pertimbangkan memperluas posting Anda untuk memasukkan penjelasan tentang solusi Anda, atau dokumentasi yang mendukungnya.
HalosGhost
0

Dengan Miller ( http://johnkerl.org/miller/doc ) Anda memiliki hasil cetak yang cantik.

Menjalankan

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

memiliki

var1                                     var2 var3
var_with_long_name_which_ruins_alignment var2 var3
aborruso
sumber