2012-07-09 78 views
2

我有這樣的代碼,唯一的區別,如何提高它如何從差異

diff -b -i -w out.txt out2.txt 
| grep '^>' 
| sed 's/^>//g' 
| sed ':a;N;$!ba;s/\n/ /g' 

的示例數據(out.txt)

abc def ghk 
abc def2 ghk 
abc def ghk 

123 333 555 
566 3423 23 
566 3423 3542 

的示例數據(out2.txt)

abc def2 ghk 
abc def ghk 
abc def ghk 

123 555 555 
fsdjhfsda sd 
566 3423 3542 

預期結果:

abc def ghk 123 555 555 fsdjhfsda sd 

回答

1

這裏有一個簡單的方法:

echo `diff -biw out.txt out2.txt | sed -n 's/^> //p'` 

如果你想獨自使用使用grep - 如果你能充分利用GNU的grep的格式化功能 - 你可以這樣做:

diff --unchanged-group-format= --changed-group-format=%\> \ 
    --new-line-format='%l ' -biw out.txt out2.txt 

這可能是最快的方法,和當文件很大時,它不需要大容量的內存緩衝區。 (你原來的sed解決方案和echo解決方案都會將行保留在內存中,直到最後,但是這會在它結束時將它們吐出。)但是該命令本身相當冗長。還要注意的是,它在輸出結尾留下了一個額外的空間。

0

貌似comm + tr是相似的:

comm --nocheck-order -13 out.txt out2.txt | tr '\n' ' ' 

你也可以把所有sedgrep到一個sed

diff -b -i -w out.txt out2.txt | sed '/^>/!{d};:a;N;$!ba;s/\n>/ /g;s/^>//' 


$ diff -b -i -w out.txt out2.txt | grep '^>' | sed 's/^>//g' | sed ':a;N;$!ba;s/\n/ /g' 
123 555 555 fsdjhfsda sd 566 3423 3542 
$ diff -b -i -w out.txt out2.txt | sed '/^>/!{d};:a;N;$!ba;s/\n>/ /g;s/^>//' 
123 555 555 fsdjhfsda sd 566 3423 3542 
$ comm --nocheck-order -13 out.txt out2.txt | tr '\n' ' ' 
123 555 555 fsdjhfsda sd 566 3423 3542 
+0

不,他們的代碼都做了完全不同的事情。它輸出的結果太多,不應該出現。抱歉。 – YeKo 2012-07-09 11:32:26

+0

你能舉一個你的數據的例子嗎?很難猜測輸出。我已經在文件'echo -e「1 \ n2 \ n3 \ n4 \ n5」> out.txt'和'echo -e「1 \ n2 \ n5 \ n4 \ n3」> out2.txt'上試過並輸出是一樣的。 – rush 2012-07-09 11:35:21

+0

當然,我已經添加了示例。 – YeKo 2012-07-09 12:30:40

0

這可能會爲你工作:

diff -b -i -w out.txt out2.txt | sed '/^>/H;$!d;g;s/\n>/ /g;s/^ *//'