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

簡単な方法の 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 ソリューションの両方が最後まで行をメモリに保持しますが、これは行が進むにつれてそれらを吐き出します。) ただし、コマンド自体はかなり冗長です。また、出力の最後に余分なスペースが 1 つ残ることにも注意してください。

于 2012-07-10T00:10:08.200 に答える
0

これはあなたのために働くかもしれません:

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

comm+trは似ているように見えます:

comm --nocheck-order -13 out.txt out2.txt | tr '\n' ' '

sedまた、すべてをgrep1つにまとめることもできます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 に答える