<分区>
我有一个文件如下,
b | b | c
aaaaaaaa | b | c
1,2,3
10000,3,4,
我想将它与两个分隔符对齐,即 |
和 ,
。预期的输出文件是
b | b | c
aaaaaaaa | b | c
1, 2, 3
10000, 3, 4,
可以使用任何简单的命令来完成吗?命令不应干扰文件中的其他文本(不包含该分隔符)。
<分区>
我有一个文件如下,
b | b | c
aaaaaaaa | b | c
1,2,3
10000,3,4,
我想将它与两个分隔符对齐,即 |
和 ,
。预期的输出文件是
b | b | c
aaaaaaaa | b | c
1, 2, 3
10000, 3, 4,
可以使用任何简单的命令来完成吗?命令不应干扰文件中的其他文本(不包含该分隔符)。
最佳答案
首先,您需要找到每一列的宽度。一旦你有了它,你就可以轻松地创建一个 sprintf
格式。
use List::Util qw( max );
my @a = (
[qw( b b c )],
[qw( aaaaaaaa b c )],
);
my @col_widths =
map {
my $col_idx = $_;
max
map { length($a[$_][$col_idx]) }
0..$#a
}
0..$#{ $a[0] };
# 8, 1, 1 => "%-8s | %-1s | %s"
my $format =
join " | ",
map("%-${_}s", @col_widths[ 0..$#col_widths-1 ]),
"%s";
say sprintf($format, @$_)
for @a;
在第二种情况下,需要在格式宽度中包含逗号的空格,并且需要为除最后一列之外的每个列值添加一个逗号。
# 5, 1, 1 => "%-6s %-2s %s"
my $format =
join " ",
map({ sprintf("%%-%ss", $col_widths[$_]+1) }
0..$#col_widths-1
),
"%s";
say
sprintf($format,
map("$_,", @$_[ 0..$#$_-1 ]),
$_->[-1],
)
for @a;
解决方案假定每行具有相同数量的列。根据需要进行调整。
关于linux - 如何在 Linux 中对齐包含不同分隔符的文本文件的不同部分?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58780224/