如何在Linux中对齐包含不同分隔符的文本文件的不同部分? [关闭]
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何在Linux中对齐包含不同分隔符的文本文件的不同部分? [关闭]相关的知识,希望对你有一定的参考价值。
我有如下文件,
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中对齐包含不同分隔符的文本文件的不同部分? [关闭]的主要内容,如果未能解决你的问题,请参考以下文章