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


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

나도! 찾을 수 없습니다. prnl포맷에 대한 두 가지 기본 도구는, 그 후 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.