탭으로 구분된 목록을 멋지게 배치하는 명령

탭으로 구분된 목록을 멋지게 배치하는 명령

가끔 입력 탭으로 구분된 목록이 정렬되지 않은 경우가 있습니다. 예를 들면 다음과 같습니다.

var1  var2  var3
var_with_long_name_which_ruins_alignment  var2 var3

정렬하는 쉬운 방법이 있나요?

var1                                      var2  var3
var_with_long_name_which_ruins_alignment  var2  var3

답변1

그러면 대답은 다음과 같습니다.

column -t file_name

이렇게 하면 열이 다음으로 분할됩니다.어느탭뿐만 아니라 공백도 가능합니다. 탭에서만 분할하려면 다음을 사용하십시오.

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

-s $'\t'구분 기호를 탭에만 설정 하고 -n빈 열(인접 탭)을 유지합니다.

추신: 크레딧은 다음과 같습니다.알렉스게다가. 원래 팁은 질문에 대한 의견으로 그가 제공했지만 답변으로 게시되지 않았습니다.

답변2

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

자동 탭 정지의 경우 권장사항을 따르세요.알렉스:column -t

( expand전체적으로POSIX 시스템. column덕분에 많은 Linux 배포판에서도 사용할 수 있는 BSD 유틸리티입니다.유틸리티Linux.)

답변3

이 작업을 수행하는 스크립트는 다음과 같습니다.

라벨 정렬

#!/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

답변4

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는 각각 줄 번호를 추가하고 개행을 비활성화합니다.

관련 정보