2016-08-12 38 views
1

假设两个列表具有不同的内容。为了简单起见,让我们假设这些列表仅包含字母数字字符串。我想合并并将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 
+2

乍一看,它看起来像'comm'可能是你需要的工具。您需要后处理输出以正确翻译缺失的字段。但是,它需要分类输入,因此它可能不是适用于该工作的正确工具,除非输出的顺序无关紧要。几乎可以肯定,需要'awk'(或Perl或Python,或...)。由于您的内容匹配需求,您不能使用“粘贴”。如果使用超过2个文件,使得Perl或Python比'awk'更适合,但如果你真的努力工作,你可能可以在'awk'中完成。 –

+0

bash的哪个版本? – cdarke

+0

@cdarke理想情况下,代码可以用于GNU bash 4.3.46 –

回答

3

您可以使用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 
+0

在第二个命令答案中缺少第一行? –

+0

@pasabaporaqui确实,谢谢。固定。 –

+1

@OhadEytan优秀的答案!谢谢。 –

0

只是diffsed将工作比较仅有2文件

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

结果(很好地排队):

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

,以便处理输入文件大于2

+0

我们甚至没有得到一个替代解决方案upvote? ;-( – tale852150

1

这里是辖伊藤的回答很可能更快的版本将需要更多的工作,只有相关对于非常大或很多的文件:

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