如何从差异中获得唯一的区别

时间:2012-07-09 11:16:30

标签: linux sed diff

我有这个代码,如何改进它

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

3 个答案:

答案 0 :(得分:2)

这是一个简单的方法:

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解决方案都会将内存中的行保留到最后,但是这会随着它的出现而吐出来。)但命令本身非常冗长。另请注意,它会在输出的末尾留下一个额外的空格。

答案 1 :(得分: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 

答案 2 :(得分:0)

这可能对您有用:

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