如何在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中对齐包含不同分隔符的文本文件的不同部分? [关闭]的主要内容,如果未能解决你的问题,请参考以下文章

如何在 RichTextBox C# 中“对齐”文本?

无论vuetify中的文本如何,如何在卡片中底部对齐按钮?

解析文本文件的不同行的有效方法

如何垂直对齐2种不同大小的文本?

如何在 R 中处理文本文件的所有元素

linux中如何对一个文本内容进行排序呢