linux - 根据分隔符在多列中打印文件

标签 linux bash perl file unix

这似乎是一项简单的任务,但使用 duckduckgo 我无法找到一种方法来正确地完成我正在尝试的事情。

主要问题是:如何使用定界符将 linux 或 bash 中命令的输出拆分为多列?

我有一个看起来像这样的文件:(这只是一个简化的例子)

-----------------------------------
Some data
that varies in line length
-----------------------------------

-----------------------------------
More data that is seperated
by a new line and dashes
-----------------------------------

等等。每次将数据写入文件时,它都包含在一行破折号中,由最后一个 block 的空行分隔。数据的行长各不相同。我想要的基本上是一种使用 bash 将文件分成多列的工具或方法,如下所示:

-----------------------------------        -----------------------------------
Some data                                  More data that is seperated
that varies in line length                 by a new line and dashes
-----------------------------------        -----------------------------------

每列应占屏幕的 50%,无需居中(如对齐)。文件必须 按 block 拆分。在中间分割文件或类似的东西是行不通的。我基本上希望第 1 block 转到左列,第 2 block 向右,第 3 block 再次向左,4 向右,依此类推。该文件不断更新,更新应立即写入屏幕。 (目前我正在使用 tail -f)

因为这听起来像是一个相当普遍的问题,所以我欢迎采用一般方法来解决这个问题,而不是只对我的情况有效的特定答案,这样来自搜索引擎的人们正在寻找一种在 bash 中使用两列布局的方法得到一些信息太。我尝试了 columnpr,两者都没有按预期工作。 (我在评论中对此进行了详细说明)

编辑:明确地说,我正在寻找一个一般的方法。遍历一个文件,获取定界符之间的数据,将其放入 A 列,获取下一个数据并将其放入 B 列,依此类推。

最佳答案

这个问题被标记为 Perl,所以这是一个可能的 Perl 答案:

#!/usr/bin/env perl
use strict;
use warnings;

my $is_col1 = 1;
my $in_block = 0;
my @col1;

while (<DATA>) {
    chomp;
    if (/^\s*-+\s*$/ ... /^\s*-+\s*$/) {
        $in_block = 1;
        if ($is_col1) {
            push @col1, $_;
        }
        else {
            printf "%-40s%-40s\n", shift @col1 // '', $_;
        }

    }
    else {
        if ($in_block) {
            $in_block = ! $in_block;
            $is_col1 = ! $is_col1;
            print "\n" if $is_col1; # line separating blocks
        }
    }
}

print join("\n", @col1), "\n\n" if @col1;

__DATA__
-----------------------------------
Some data
that varies in line length
-----------------------------------

-----------------------------------
More data that is seperated
by a new line and dashes
with a longer column2
-----------------------------------


-----------------------------------
The odd last column
-----------------------------------

输出:

-----------------------------------     -----------------------------------
Some data                               More data that is seperated
that varies in line length              by a new line and dashes
-----------------------------------     with a longer column2
                                        -----------------------------------

-----------------------------------
The odd last column
-----------------------------------

关于linux - 根据分隔符在多列中打印文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49620687/

相关文章:

regex - 如何在 bash 中替换字符串中的模式

perl - 如何使用 Perl 的 Text::Aspell 对文本进行拼写检查?

perl - 如何在perl脚本中捕获shell脚本的退出代码?

perl - 在 Perl 催化剂中通过 URL 传递参数

c - 通过内核函数获取linux文件系统信息

linux - 配置 Apache 以允许禁止目录列表

linux - 对 bash 脚本进行故障排除以将每个单词的首字母大写

java - JAVE (Java Audio Video Encoder) 库异常仅在 Linux (CentOS 7)

c - 如何通过C-Linux向串口发送AT命令

linux - 使用 Bash,如何在不使用 'ln -s' 的情况下将文件列表输入 'find' ?