2012-07-09 83 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/^ *//'