कमांड टैब लेआउट सूची को अच्छी तरह से अलग किया


39

कभी-कभी, मैं एक इनपुट टैब से अलग की गई सूची के रूप में प्राप्त कर रहा हूं, जो कि उदाहरण के लिए काफी संरेखित नहीं है

var1  var2  var3
var_with_long_name_which_ruins_alignment  var2 var3

वहाँ उन्हें गठबंधन करने के लिए एक आसान तरीका है?

var1                                      var2  var3
var_with_long_name_which_ruins_alignment  var2  var3

कोई व्यक्ति इलास्टिक टैबस्टॉप
मिकेल


और एक गो कार्यान्वयन: golang.org/pkg/tabwriter
मिकेल

16
इसे करने की कोशिश की column -t?
एलेक्स

7
मिकेल के उल्टे जवाब के अंत में टके से लिया गया यह क्लिनिक टिप्पणी है (मिकेल द्वारा) ... columns -tसामान्य व्हाट्सएप पर कार्य करता है। के साथ काम करने के लिए टैब केवल , उपयोगcolumn -t -s $'\t'
Peter.O

जवाबों:


51

तो, उत्तर बन जाता है:

column -t file_name

ध्यान दें कि यह किसी भी व्हाट्सएप पर कॉलम को विभाजित करता है , न कि केवल टैब पर। यदि आप केवल टैब पर विभाजित करना चाहते हैं, तो उपयोग करें:

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

-s $'\t'सेट टैब के लिए सीमांकक केवल और -nबरकरार रखता है खाली कॉलम (आसन्न टैब्स)।

पुनश्च: बस यह बताना चाहता हूं कि इसका श्रेय एलेक्स को भी जाता है । मूल संकेत उनके द्वारा प्रश्न के लिए एक टिप्पणी के रूप में प्रदान किया गया था, लेकिन उत्तर के रूप में कभी भी पोस्ट नहीं किया गया था।


मैं एलेक्स को श्रेय पाने के लिए थोड़ा इंतजार करूंगा, मुझे लगता है कि वह इसका हकदार है। अगर वह कुछ दिनों में जवाब नहीं देता है तो मैं किसी और से जवाब स्वीकार करूंगा।
एलजार लीबोविच

ज़रूर! मैं भी अनजान था column:)
बरुण

1
यह आदर्श लगता है लेकिन दुर्भाग्य से columnलगता है जब यह खाली कोशिकाओं का सामना करता है। इस पोस्ट को देखें । columnआपके पास कौन सा संस्करण है, इसके आधार पर , आप इसे ठीक करने के लिए -nविकल्प निर्दिष्ट करने में सक्षम हो सकते हैं ।
जॉन जे। कैमिलेरी

साथ ही, यह आदेश न केवल टैब पर, बल्कि "किसी भी व्हाट्सएप" पर भी विभाजित होगा। केवल टैब पर विभाजित करने के लिए, उपयोग करें column -t -s $'\t'
फ्रिट्ज़

3

यहाँ यह करने के लिए एक स्क्रिप्ट है:

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

प्रयोग

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

उम, धन्यवाद, लेकिन मैं उम्मीद कर रहा था कि ऐसा करने के लिए एक और "पोर्टेबल" तरीका है।
एलजार लीबोविच

मैं भी! एक नहीं मिल सका। prऔर nlप्रारूपण के लिए दो बुनियादी उपकरण हैं, और उसके बाद awk, sed, perl, आदि
मिकेल

1
यह उतना ही सरल हैcolumn
एलाज़ार लीबोविच

2
@Elzar बहुत बढ़िया! column -t -s $'\t'काम करने लगता है।
मिकेल

3

मैनुअल टैब स्टॉप के लिए: expand -t 42,48

एलेक्स द्वारा सुझाए गए अनुसार स्वचालित टैब स्टॉप के लिए :column -t

( expandसभी POSIX सिस्टम पर है। columnएक BSD उपयोगिता है, जो कई लिनक्स वितरण में भी उपलब्ध है।)


1

पीटर.ओ की टिप्पणी के बाद जो मैं संरेखित करना चाहता था (टैब सीमांकित डेटा, टीएसवी), यह वाक्यांश बहुत अच्छी तरह से काम करता है:

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

स्पष्टीकरण:

सैड रिक्त परिसीमन के बीच एक स्थान जोड़ देगा

कॉलम के बीच कॉलम समान रिक्ति जोड़ेगा

zydsld|asl|asd
das|aosdk|dd

हो जाता है

zydsld|asl  |asd
das   |aosdk|dd 

फ़ाइल व्यूअर में आउटपुट कम खुलेगा। -N और -S क्रमशः लाइन नंबर और अक्षम रैपिंग जोड़ देगा


1
एक-पंक्ति उत्तर अक्सर सबसे अधिक मददगार नहीं होते हैं। अपने समाधान, या प्रलेखन का समर्थन करने वाले विवरण को शामिल करने के लिए अपनी पोस्ट का विस्तार करने पर विचार करें।
हेलोजिहोस्ट

0

मिलर ( http://johnkerl.org/miller/doc ) के साथ आपके पास सुंदर प्रिंट आउटपुट हैं।

रन

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

रखने के लिए

var1                                     var2 var3
var_with_long_name_which_ruins_alignment var2 var3
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.