有时,我会得到一个输入选项卡分隔的列表,例如,该列表不太对齐
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
保留空列(相邻制表符)。
PS:只是想指出功劳归于亚历克斯以及。最初的提示是他作为对问题的评论提供的,但从未作为答案发布。
答案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 将分别添加行号和禁用换行