linux - 如何在 Linux 中对齐包含不同分隔符的文本文件的不同部分?

标签 linux bash perl

<分区>

我有一个文件如下,

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/

相关文章:

string - 如何在 Perl 中连接变量

Perl : Standard Application development approach

python - 无法使用 Python3 在 Ubuntu 上安装 selenium

linux - 无法终止在 Linux 上运行 hcitool 的 QProcess?

Bash 变量 SECONDS 立即扩展还是延迟扩展?

git - 在 git bash 中创建一个新文件

perl - 在 Perl eval 中捕获变量赋值

linux - 为什么在 Bash 中应该避免使用 eval,我应该使用什么来代替?

c - 将套接字绑定(bind)到网络接口(interface)时出错

bash - Flutter 桌面 - 将 PDF 发送到打印机