并排打印两列中的两个文件

并排打印两列中的两个文件

我想在两列中输出两个文本文件 - 一列在左侧,另一列在右侧。

paste并不能解决问题,因为它只插入一个字符作为分隔符,所以如果第一个文件具有不同长度的行,输出将被扭曲:

$ cat file1
looooooooong line
line
$ cat file2
hello
world
$ paste file1 file2
looooooooong line   hello
line    world

如果有一个命令添加尾随空格,那么fmt --add-spaces --width 50问题就可以解决(1)

$ paste <(fmt --add-spaces --width 50 file1) file2
looooooooong line                                 hello
line                                              world

但我不知道有什么简单的方法可以做到这一点。

那么如何水平合并文件并将它们打印到标准输出而不扭曲呢?

事实上,我只是想并排阅读它们。


(1)更新:添加尾随空格的命令确实存在,例如xargs -d '\n' printf '%-50s\n'.但是,当行数少于 时,运行
$ paste <(add-trailing-spaces file1) file2 不会产生预期的视觉输出。file1file2

答案1

使用单个pr命令:

pr -Tm file[12]
  • -T( --omit-pagination) - 省略页眉和页尾,通过输入文件中设置的换页消除任何分页

  • -m( --merge) - 并行打印所有文件,每列一个

答案2

关于什么paste file{1,2}| column -s $'\t' -tn

looooooooong line line  hello
line                    world
  • 这表明column用作Tab列的分隔符,我们从命令中获取它,paste如果未指定,则该命令是默认的分隔符;一般来说:

    paste -d'X' file{1,2}| column -s $'X' -tn

    其中X表示任何单个字符。您需要选择一个不会出现在您的文件中的选项。

  • -t选项用于确定输入包含的列数。

  • 这不会在两个文件之间添加长制表符,而其他答案则会添加长制表符。
  • 即使 file1 中有空行,这也会起作用,并且不会在 file1 的打印区域中打印第二个文件,参见下面的输入/输出

    输入文件1:

    looooooooong line
    
    line
    

    输入文件2:

    hello
    world
    

    输出:

    looooooooong line  hello
                       world
    line
    

答案3

便携式解决方案:

$ paste file1 file2 | awk -F'\t' '{ printf("%-30s %s\n", $1, $2) }'
looooooooong line              hello
line                           world

这用于paste为 生成制表符分隔的输入awk

awk脚本仅采用两个制表符分隔的字段并使用 输出它们printf()。为第一个文件保留 30 个字符的列。意思%-30s是“字符串数据的 30 个位置左对齐”。删除-将产生一个右对齐的列,更改30将更改列宽。

它还处理不均匀长度的文件。我在第二个文件中添加了几行:

looooooooong line              hello
line                           world
                               hello
                               world
                               hello
                               world

并且,当在命令行上反转文件的顺序时:

hello                          looooooooong line
world                          line
hello
world
hello
world

答案4

尝试:

paste -d '\n' file1 file2 | xargs -d '\n' printf '%-30s  %-30s\n'

灵感来自@Kusalananda的解决方案

注意:-d的参数xargs仅在 GNU 版本上可用,在 BSD 上不可用。

相关内容