가끔 입력 탭으로 구분된 목록이 정렬되지 않은 경우가 있습니다. 예를 들면 다음과 같습니다.
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
답변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는 각각 줄 번호를 추가하고 개행을 비활성화합니다.