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

在Linux中,如何对齐包含不同分隔符的文本文件的不同部分?,linux,bash,perl,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 );

我有一个文件如下:

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;

这些解决方案假定每行具有相同的列数。根据需要进行调整。

首先,您需要找到每列的宽度。一旦有了它,您就可以轻松创建
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;

这些解决方案假定每行具有相同的列数。根据需要进行调整。

如果该行同时包含两个分隔符怎么办?具有相同分隔符的行是否总是相邻?欢迎使用堆栈溢出。这也是一个面向专业和热心程序员的问答网站。目标是在你的问题中添加一些你自己的代码,至少显示你自己为解决这个问题所做的研究工作。“这可以通过使用任何简单的命令来完成吗?”——考虑到需要做的事情,我不这么认为——或者:读入整个文件,并在这个过程中找到每列的最大宽度;然后写出来,现在知道每个领域应该有多宽;或者:对文件进行一次遍历以找到最大宽度,然后进行另一次遍历以读取一行并以正确的字段宽度写出一个新文件,最终将其移动到原始文件上(这种方法的优点是:您从不读取整个文件,一次总是一行)。如果该行同时包含两个分隔符怎么办?具有相同分隔符的行是否总是相邻?欢迎使用堆栈溢出。这也是一个面向专业和热心程序员的问答网站。目标是在你的问题中添加一些你自己的代码,至少显示你自己为解决这个问题所做的研究工作。“这可以通过使用任何简单的命令来完成吗?”——考虑到需要做的事情,我不这么认为——或者:读入整个文件,并在这个过程中找到每列的最大宽度;然后写出来,现在知道每个领域应该有多宽;或者:对文件进行一次遍历以找到最大宽度,然后进行另一次遍历以读取一行并以正确的字段宽度写出一个新文件,最终将其移动到原始文件上(这种方法的优点是:您从不读取整个文件,每次总是一行)。