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
以及 tr
和 sed
:
$ diff -t -y file1 file2 | tr -s ' ' | sed 's/[<>]/-/'
foo foo
foo -
bar bar
- bar
- baz
qux qux
只有 diff
和 sed
在比较 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\+'
假设有两个内容不同的列表。为简单起见,让我们假设这些列表仅包含字母数字字符串。我想合并并垂直对齐 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
以及 tr
和 sed
:
$ diff -t -y file1 file2 | tr -s ' ' | sed 's/[<>]/-/'
foo foo
foo -
bar bar
- bar
- baz
qux qux
只有 diff
和 sed
在比较 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\+'