2017-05-12 3 views
0

シェルスクリプトには新しく、これをどうやって進めるのかが分かりませんでした。
2つのCSVファイルの間に相違点だけを残してください。

file1.csv | file2.csv 
-------------------- 
Apples  Apples 
Dogs  Dogs 
Cats  Cats 
Grapes  Oranges 
Batman  Thor 
Borgs  Daleks 
Kites  Kites 
Blah  Blah 
xyz   xyz 

どのように私は、各ファイルの違いを保つか、との差異の開始上記の2行、および後の2行:
は、私は2つのファイルを持っていると仮定しますか?たとえば、出力は次のようになります。

file1.csv | file2.csv 
----------------------- 
Dogs   Dogs 
Cats   Cats 
Grapes  Oranges 
Batman  Thor 
Borgs   Daleks 
Kites   Kites 
Blah   Blah 

ありがとうございました!

+0

'diff'コマンドを使用 –

+0

ファイル自体に変更を加える必要があります。 diffはそれを行うことができるだろうか? – AnnaR

答えて

0

これはdiffの仕事です。

diff -u2 file1.csv file2.csv | sed '1,3d;/@@/,+2d' > diff 

diffコマンドは以下の形式のファイルのメタ情報を含むパッチスタイルの違いを生成します。

--- file1.csv 2017-05-12 15:21:47.564801174 -0700 
+++ file2.csv 2017-05-12 15:21:52.462801174 -0700 
@@ -2,7 +2,7 @@ 

差の任意のブロックが@@ -2,7 +2,7 @@のようなヘッダを持つことになります。我々はこれをsedを使って投げ捨てたい。

1,3d - トップ3行

/@@/,+2dを削除する手段 - それの後@@を含む任意の行と次の2行を削除します。これはあなたのケースでは必要ではありませんが、入力に突然複数のブロックがある場合に備えて、ここに含めるとよいでしょう。

上記のコマンドの結果は、このリストを生成します。

Dogs 
Cats 
-Grapes 
-Batman 
-Borgs 
+Oranges 
+Thor 
+Daleks 
Kites 
Blah 

内容は' ''+'だけfile2.csv上にある間'-'だけfile1.csv上で、両方に共通で、1文字の接頭辞を持っています。これを2つのファイルに配布するだけです。ここ

sed '/^+.*/d;s/^.//' diff > file1.csv 
sed '/^-.*/d;s/^.//' diff > file2.csv 

sedのコマンドは、ファイルをフィルタリングし、入力ファイルのそれぞれに適切な内容を記述します。

/^+.*/d - '+'で始まる行は削除されます。

s/^.// - diffで追加された1文字のプレフィックスが削除されます。

/^-.*/d - '-'で始まる行は削除されます。

最後に、一時ファイルdiffを削除します。

+0

あなたは 'sed'コマンドで何が起こっているかの内訳を教えてください – hmedia1

+0

ありがとう、私の質問に答えてくれてありがとう!ほんとうにありがとう。私は第二@ hmedia1、ここでsedが何をしているか説明してもらえますか? – AnnaR

関連する問題