如何从diff中获取差异

6

我有这段代码,怎么改进它呢

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
4个回答

6
这里有一个简单的方法:
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 

不好意思,这两段代码完全做了不同的事情,输出了太多不应该出现的结果。 - Yehuda
你能展示一下你的数据吗?猜测输出结果相当困难。我已经在文件 echo -e "1\n2\n3\n4\n5" > out.txtecho -e "1\n2\n5\n4\n3" > out2.txt 上尝试过了,输出结果是相同的。 - rush
那么,出了什么问题吗?我提到的唯一区别是预期输出和我的变量输出中换行符所在位置的空格数量。这有关系吗? - rush
我已经编辑了代码并提供了另一种情况,你的结果是 abc def[2] ghk 123 555 555 fsdjhfsda sd [566 3423 3542],方括号 [] 不应该出现(第一个代码)。 - Yehuda

0

这个可能适合你:

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

0
user@computer:~$ cat out.txt
abc def ghk
abc def2 ghk
abc def ghk

123 333 555
566 3423 23
566 3423 3542

user@computer:~$ cat out2.txt
abc def2 ghk
abc def ghk
abc def ghk

123 555 555
fsdjhfsda sd
566 3423 3542

user@computer:~$ diff out.txt out2.txt | grep '^>' | cut -d" " -f2-
abc def ghk
123 555 555
fsdjhfsda sd

使用grep '^<'命令列出相同的行。 要将输出显示在一行上,请进一步使用管道符号xargs。
... | xargs echo

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接