레이아웃 탭으로 분리 된 목록에 대한 명령


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

탄력있는 탭 스톱을
— Mikel


그리고 Go 구현 : golang.org/pkg/tabwriter
— Mikel

16
배관을 시도 column -t했습니까?
— alex

7
Mikel의 펄 답변의 끝 부분에 자리 잡은 클린 처 의견은 Mikel의 columns -t일반적인 공백에 대한 행동입니다. 작업을하려면 탭에만 사용column -t -s $'\t'
— Peter.O

답변:


51

따라서 대답은 다음과 같습니다.

column -t file_name

이것은 탭뿐만 아니라 모든 공백 에서 열을 분할 합니다. 탭으로 만 분할하려면 다음을 사용하십시오.

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

-s $'\t'설정 탭에 구분 기호 만 -n보존 빈 열 (인접 탭).

추신 : 크레딧이 Alex 에게도 해당된다는 점을 지적하고 싶습니다 . 원래 힌트는 질문에 대한 주석으로 제공되었지만 답변으로 게시되지 않았습니다.


Alex가 크레딧을받을 때까지 조금 기다릴 것입니다. 그가 가치가 있다고 생각합니다. 그가 며칠 안에 대답하지 않으면 다른 사람의 대답을 받아 들일 것입니다.
— Elazar Leibovich

확실한! 나도 몰랐다 column:)
— Barun

1
이것은 이상적인 것처럼 보이지만 불행히도 column빈 셀이 발견되면 실패하는 것처럼 보입니다. 이 게시물을 참조하십시오 . 사용중인 버전에 따라 이를 수정 column하는 -n옵션을 지정할 수 있습니다 .
— John J. Camilleri

또한이 명령은 탭뿐만 아니라 "모든 공백"에서도 분할됩니다. 탭으로 만 분할하려면을 사용하십시오 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

고마워.하지만 더 "이동할 수있는"방법이 있기를 바랐다.
— Elazar Leibovich

나도! 찾을 수 없습니다. pr및 nl포맷에 대한 두 가지 기본 도구는, 그 후 awk, sed, perl, 등
— 미켈

1
그것은 간단합니다column
— Elazar Leibovich

2
@Elzar 훌륭합니다! column -t -s $'\t'일을하는 것 같습니다.
— Mikel

3

수동 탭 정지의 경우 : expand -t 42,48

alex가 제안한 자동 탭 중지의 경우 :column -t

( expand모든 POSIX 시스템에 있습니다. column많은 Linux 배포판에서도 사용할 수있는 BSD 유틸리티입니다.)


1

내가 맞추고 싶었던 Peter.O의 의견 (탭 구분 데이터, TSV)에 따라이 문구는 매우 훌륭하게 작동합니다.

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

설명:

Sed는 공백 제거기 사이에 공백을 추가합니다

열은 열 사이에 동일한 간격을 추가합니다

zydsld|asl|asd
das|aosdk|dd

된다

zydsld|asl  |asd
das   |aosdk|dd 

Less는 파일 뷰어에서 출력을 엽니 다. -N과 -S는 줄 번호를 추가하고 줄 바꿈을 비활성화합니다.


1
단선 답변은 종종 가장 도움이되지 않습니다. 솔루션에 대한 설명 또는이를 지원하는 문서를 포함하도록 게시물을 확장하십시오.
— HalosGhost

0

Miller ( 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
당사 사이트를 사용함과 동시에 당사의 쿠키 정책과 개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.