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

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.


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

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.)


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

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


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
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.