bash 中不同内容列表的垂直对齐

Vertical alignment of lists with different content in bash

假设有两个内容不同的列表。为简单起见,让我们假设这些列表仅包含字母数字字符串。我想合并并垂直对齐 bash 中的两个列表。

user$ cat file1
foo
foo
bar
qux

user$ cat file2
foo
bar
bar
baz
qux

user$ sought_command file1 file2
foo foo
foo -
bar bar
- bar
- baz
qux qux

每行值之间的分隔符(这里是单个空格)不需要由用户选择,但可以硬编码。间隙的占位符也可以(这里是破折号)。

编辑:

理想情况下,此命令不限于两个输入列表,而是可以获取任意数量的输入文件,每个文件与指定的第一个文件进行比较。

user$ sought_command file1 file2 file2
foo foo foo
foo - -
bar bar bar
- bar bar
- baz baz
qux qux qux

您可以使用 diff-y 标志来获得:

$ diff -y file1 file2
foo                             foo
foo                               <
bar                             bar
                                  > bar
                                  > baz
qux                             qux

以及 trsed:

$ diff -t -y file1 file2 | tr -s ' ' | sed 's/[<>]/-/' 
foo foo
foo -
bar bar
 - bar
 - baz
qux qux

只有 diffsed 在比较 2 个文件时有效

diff -y file1 file2 | sed 's/[[:space:]]\+/ /g' | sed 's/[<,>]/- /g'

结果(排列整齐):

foo foo
foo -
bar bar
 -  bar
 -  baz
qux qux

需要更多工作才能处理大于 2 的输入文件。

这是 Ohad Eytan 答案的一个很可能更快的版本,仅与非常大或非常多的文件相关:

diff -t -y file1 file2 | tr -s ' ' | tr '[<>]' '-' | grep -o '\S\+ \S\+'