我有这个代码,如何改进它
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
答案 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' ' '
此外,您可以将所有sed
和grep
合并为一个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/^ *//'