追加および削除された行のみを表示するためにdiffを取得するにはどうすればよいですか?diffでできない場合、どのツールができますか?
diff A B | grep '^[<>]'
comm
いるかもしれません。
追加および削除された行のみを表示するためにdiffを取得するにはどうすればよいですか?diffでできない場合、どのツールができますか?
diff A B | grep '^[<>]'
comm
いるかもしれません。
回答:
別の見方:
ファイルaにのみ存在する行を表示します:(つまり、aから削除されたもの)
comm -23 a b
ファイルbにのみ存在する行を表示します:(つまり、bに追加されたもの)
comm -13 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倍になるため、これはかなりの負担になる可能性があります。
comm -12 <(sort a) <(sort b)
comm
あなたがしたいことをするかもしれません。そのmanページから:
記述
ソートされたファイルFILE1とFILE2を1行ずつ比較します。
オプションなしで、3列の出力を生成します。列1にはFILE1に固有の行が含まれ、列2にはFILE2に固有の行が含まれ、列3には両方のファイルに共通の行が含まれます。
これらの列は、それぞれと-1
で抑制できます。-2
-3
例:
[root@dev ~]# cat a
common
shared
unique
[root@dev ~]# cat b
common
individual
shared
[root@dev ~]# comm -3 a b
individual
unique
そして、もしあなたがただユニークな行が欲しいなら、それらがどのファイルにあるか気にしないなら:
[root@dev ~]# comm -3 a b | sed 's/^\t//'
individual
unique
マニュアルページにあるように、ファイルは事前にソートする必要があります。
コンテキスト、行番号、+、-、<、>なしで追加と削除を表示するには など、次のようにdiffを使用できます。
diff --changed-group-format='%<%>' --unchanged-group-format='' a.txt b.txt
たとえば、2つのファイルがある場合:
a.txt
Common
Common
A-ONLY
Common
b.txt
Common
B-ONLY
Common
Common
次のコマンドは、aから削除された行またはbに追加された行を表示します。
diff --changed-group-format='%<%>' --unchanged-group-format='' a.txt b.txt
出力:
B-ONLY
A-ONLY
このわずかに異なるコマンドは、a.txtから削除された行を表示します。
diff --changed-group-format='%<' --unchanged-group-format='' a.txt b.txt
出力:
A-ONLY
最後に、このコマンドはa.txtに追加された行を表示します
diff --changed-group-format='%>' --unchanged-group-format='' a.txt b.txt
出力
B-ONLY
それはデフォルトでdiffが行うことです...たぶん、空白を無視するためにいくつかのフラグを追加する必要がありますか?
diff -b -B
空白行と異なる数のスペースを無視する必要があります。
いいえ、diff
実際に2つのファイルの違いを考えられるように表示しません。patch
あるファイルを別のファイルに変更するために使用するようなツールの一連の編集コマンドを生成します。
あなたが探していることをしようとする試みの難しさは、変更された行と削除された行の後に追加された行を構成するものをどのように定義するかです。また、行が互いに隣接して追加、削除、および変更された場合の対処方法。
diff
ソースを確認してから長い時間が経ちましたが、同期を保つために2つのファイルが一致する場所を追跡するために、あらゆる種類の回転を覚えているようです。行があります。しかし、(オプションで)折りたたまれた空白または大文字と小文字の区別を除いて、行内一致を覚えていません。または(おそらく)その影響を与える言葉。いずれにせよ、それはすべてでpatch
あり、「vgrep」はただ乗って来ます。多分。火曜日に。
視覚比較ツールは2つのファイルをまとめて、同じ行数で異なるコンテンツを持つセグメントが変更されたセグメントと見なされるようにします。一致するセグメント間の完全に新しい行は、追加されたセグメントと見なされます。
これは、sdiffコマンドラインツールの動作方法でもあり、ターミナル内の2つのファイルの比較を並べて表示します。変更された行は|で区切られます キャラクター。ファイルAのみに行が存在する場合、区切り文字として<が使用されます。ファイルBにのみ行が存在する場合、>が区切り文字として使用されます。ファイルに<と>の文字がない場合、これを使用して追加された行のみを表示できます。
sdiff A B | grep '[<>]'
senarviのおかげで、あなたの解決策(投票されていない)は実際に、何トンものページで年齢を探した後、私が望んでいたものを正確にくれました。
あなたの答えを使用して、変更/追加/削除されたもののリストを取得するために私が思いついたものを以下に示します。この例では、2つのバージョンの/ etc / passwdファイルを使用し、関連レコードのユーザー名を出力します。
#!/bin/bash
sdiff passwd1 passwd2 | grep '[|]' | awk -F: '{print "changed: " $1}'
sdiff passwd1 passwd2 | grep '[<]' | awk -F: '{print "deleted: " $1}'
sdiff passwd1 passwd2 | grep '[>]' | awk -F\> '{print $2}' | awk -F: '{print "added: " $1}'
私はこの特定のフォームがしばしば役に立つと思います:
diff --changed-group-format='-%<+%>' --unchanged-group-format='' f g
例:
printf 'a\nb\nc\nd\ne\nf\ng\n' > f
printf 'a\nB\nC\nd\nE\nF\ng\n' > g
diff --old-line-format=$'-%l\n' \
--new-line-format=$'+%l\n' \
--unchanged-line-format='' \
f g
出力:
-b
-c
+B
+C
-e
-f
+E
+F
したがって、古い行が表示-
され、直後に対応する新しい行が続き+
ます。
の削除があった場合C
:
printf 'a\nb\nd\ne\nf\ng\n' > f
printf 'a\nB\nC\nd\nE\nF\ng\n' > g
diff --old-line-format=$'-%l\n' \
--new-line-format=$'+%l\n' \
--unchanged-line-format='' \
f g
次のようになります。
-b
+B
+C
-e
-f
+E
+F
形式は次の場所で文書化されていman diff
ます。
--line-format=LFMT
format all input lines with LFMT`
そして:
LTYPE is 'old', 'new', or 'unchanged'.
GTYPE is LTYPE or 'changed'.
そして:
LFMT (only) may contain:
%L contents of line
%l contents of line, excluding any trailing newline
[...]
関連する質問:https : //stackoverflow.com/questions/15384818/how-to-get-the-difference-only-additions-between-two-files-in-linux
Ubuntu 18.04でテスト済み。