3

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

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

3 回答 3

3

这是一种简单的方法:

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 解决方案都会将行保留在内存中直到结束,但这会随着它的进行而将它们吐出。)不过,命令本身非常冗长。另请注意,它在输出末尾留下了一个额外的空间。

于 2012-07-10T00:10:08.200 回答
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 
于 2012-07-09T11:22:11.750 回答
0

这可能对您有用:

diff  -b -i -w out.txt out2.txt | sed '/^>/H;$!d;g;s/\n>/ /g;s/^ *//'
于 2012-07-09T14:40:08.830 回答