bash

时间:2016-08-12 15:10:15

标签: string bash command-line text-alignment

假设两个内容不同的列表。为简单起见,我们假设这些列表仅包含字母数字字符串。我想在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

3 个答案:

答案 0 :(得分:3)

您可以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

答案 1 :(得分:1)

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

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

答案 2 :(得分:0)

仅比较2个文件时,只需diffsed即可。

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

结果(很好地排队):

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

为了处理大于2的输入文件,还需要做更多工作。