2013-03-13 11 views
20

私はA1とA2の2つのファイル(ソートされていない)を持っています。 A1はA2の前のバージョンであり、A2にはいくつかの行が追加されています。 A2に追加された新しい行を取得するにはどうすればよいですか?linuxの2つのファイルの違いを取得する方法(追加のみ)

注:私はちょうど新しい行が追加され、A1にあったがA2で削除された行は必要ありません。私がdiff A1 A2をするとき、私は追加だけでなく、削除を得るが、私は追加が欲しい。

これを行う方法を提案してください。

+0

は、すべてファイルにA2の新しい行が追加されていますか?私は既存の行と重複しないことを意味しますか? – Kent

+0

@kent no duplicates – user1004985

答えて

25

diff、次にgrepの編集タイプです。

grep -v -f A1 A2 
+2

これは、行頭に '+'を残します。 – kgadek

5

に見ることができるように、もう一つの方法は、COMMを使用することです

sdiff A1 A2 

を使用することです試してみてください

差分--changedグループ-フォーマット= '%>' --unchangedグループ-フォーマット= '' A1 A2

+0

ファイル 'A1'には' x'という行が含まれ、ファイル 'A2'には' x'という行と 'xx'というファイルがあると仮定します。 '。 'A2'の両方の行に' x'が含まれているので、このコマンドは何も出力しません。 – timrau

19

あなたがすることができます

diff -u A1 A2 | grep -E "^\+" 
+4

これらのオプションを説明してもらえますか?マニュアルページからそれらを得ることはできません – user1004985

+2

詳細については、このリンクを参照してください[ライングループのフォーマット](http://www.gnu.org/software/diffutils/manual/html_node/Line-Group -Formats.html) – merp

16

以下TomOnTimeのserverfaultの答えhere @から直接コピーされるのすべて:

ファイルaにのみ存在する行を表示します(つまり一つだけのファイルや他に存在する(すなわちBに追加されたもの)

comm -13 a b 

表示ライン:(のみファイルbに存在するA)

comm -23 a b 

ショーラインから何を削除しました両方ではなく)

comm -3 a b | sed 's/^\t//' 

(警告:ファイルaはTABで始まる行がある場合は、それ(最初TAB)は出力から削除されます)

注: "comm"が正しく動作するためには、両方のファイルをソートする必要があります。彼らはすでにソートされていない場合は、それらを並べ替える必要があります。

sort <a >a.sorted 
sort <b >b.sorted 
comm -12 a.sorted b.sorted 

ファイルが極端に長い場合、それは余分なコピーため、2倍のディスクスペースを必要として、これはかなりの負担かもしれません。

編集:(おかげでコメント@phkため)コマンドは、プロセス置換を使用して、より簡潔に書くことができることに注意してください。

comm -12 <(sort < a) <(sort < b) 
+1

ここでは 'bash'について述べているので、最後のコマンドはプロセス置換を使って' comm -12 <(sort phk

+0

@phkありがとうございました。 – scottkosty

4
git diff path/file.css | grep -E "^\+" | grep -v '+++ b/' | cut -c 2- 
  • grep -E "^\+"は、前の受け入れ答えから、それが不完全です非ソースのものを残すので
  • grep -v '+++ b'は、ファイル名が後のバージョン
  • cut -c 2-の非ソース行を削除しますemoves +サインの列は、またsed 's/^\+//'

commまたはsdiffが原因のgitのオプションではありませんでした使用することができます。

+0

ベスト回答!これは、追加された行とまったく同じ行を返します。これは私が考える受け入れられた答えでなければなりません –