2016-08-12 70 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\+'