切り替えられた行を持つ2つのファイルを比較した結果、同じ行が2回欠落していると表示される


28

私は2行のファイルでlinux diffコマンドを理解しようとしていますが、その行はお互いの順列にすぎませんが、生成される出力を理解することはできません。以下の3つのコマンドを検討してください。

[myPrompt]$ cat file1
apples
oranges
[myPrompt]$ cat file2 
oranges
apples
[myPrompt]$ diff file1 file2
1d0
< apples
2a2
> apples

誰かが上記のdiffからの不可解な出力を説明できますか。

  1. 出力に「オレンジ」の記載がまったくないのはなぜですか?
  2. どういうない1d02a2意味ですか?

はこの答えから次のことを理解しています

「<」はfile2に行がないことを意味し、「>」はfile1に行がないことを意味します。

しかし、オレンジが出力にない理由を説明していません。


12
というのorangesは、2つのファイル間の最大の共通部分であるため、取得するのは、2つのファイルの違いを表現する最短の方法です。
ステファンシャゼル14

10
より読みやすい出力が必要な場合は、diff -u file1 file2代わりに使用してください。これは「統一差分」形式と呼ばれます。元のdiff形式は非常にコンパクトにすることを目的としていましたが、統合diffははるかに読みやすくすることを目的としています。
godlygeek 14

4
@godlygeekまたはdiff -y file1 file2
user80551 14

回答:


27

レポートを理解するにはdiff、最初のファイル(file1)に変更を加えて2番目のファイル(file2)と同じにする必要があることを記述した規範的なものであることを忘れないでください。

具体的には、din 1d0削除を意味し、ain 2a2addを意味します。

したがって:

  • 1d0は、行1をfile1apples)で削除する必要があることを意味します。01d0、彼らは第二のファイル(に登場していたところな手段ライン0であるfile2、彼らはありませんが削除されていました)。つまりfile2file1(逆方向)に変更する場合file1、行0の後に行1を追加しますfile2
  • 2a2手段は、第二のラインを(追加orangesの)file2の今第二行にfile1(最初の行を削除した後file1orangesライン1に切り替え)

何が0入っ1d0てる?
オタク14

@Geek私の編集を見る
カオス14

1
@Geekしかし、注意してください、それは脳に結び目を作ることができます=)
カオス14

それは確かに結び目を作り始めました:-)
オタク14

13

これらのファイルを検討してください。

file1

# cat file1
apples
pears
oranges
peaches

file2

# cat file2
oranges
apples
peaches
ananas
banana

diff順序ベースの場合の仕組み:

  1. difffile1およびの行の最初のブロックを読み取り、file2等しい行を見つけようとします。

      file1        file2        differences on left (<) or right side (>)
      apples                   <apples
      pears                    <pears 
      -------------------------------
    ->oranges    ->oranges
      peaches      apples
                   peaches
                   ananas
                   banana
    
  2. これで、両方のファイルで等しいすべての行がスキップされます。これはorangesこの場合だけです:

      file1        file2        differences on left (<) or right side (>)
      apples                   <apples
      pears                    <pears 
      oranges      oranges
      -------------------------------
    ->peaches    ->apples
                   peaches
                   ananas
                   banana
    
  3. 次に、同様の行の別のセットを見つけて、違いを出力します。

      file1        file2        differences on left (<) or right side (>)
      apples                   <apples
      pears                    <pears 
      oranges      oranges
                   apples      >apples
      -------------------------------
    ->peaches    ->peaches
                   ananas
                   banana
    
  4. 同様の行をスキップ

      file1        file2        differences on left (<) or right side (>)
      apples                   <apples
      pears                    <pears 
      oranges      oranges
                   apples      >apples
      peaches      peaches
      -------------------------------
    ->           ->ananas
                   banana
    
  5. 可能であれば同一の行を見つけて、違いを出力します。

    line_file1    file1    line_file2    file2        differences on left (<) or right side (>)
             1    apples                              <apples 
             2    pears                               <pears 
             3    oranges           1    oranges
                                    2    apples       >apples
             4    peaches           3    peaches
                                    4    ananas       >ananas
                                    5    banana       >banana
             -----------------------------------------------
    

今私がする場合diff file1 file2

# diff file1 file2
1,2d0
< apples
< pears
3a2
> apples
4a4,5
> ananas
> banana

これで、diff出力の意味を簡単に説明できます。

作成するにはfile1に等しいですfile2

  • 1,2d0:から()行を削除し、それに応じて行を変更しますd1-2file10file2
  • 3a2:行の行に()を追加a3file12file2
  • 4a4,5:行の行に追加4file14-5file2

diff行ごとに比較file1file2、一時メモリの違いを解決します。で最初に出現file1 する file2までに等しいを作成した後file1、で発生しfile2、差まで同じであるすべての行は言及されません---。この場合、同様の行は1つだけですoranges。私はにfile1等しいと言ったfile2ので、反対ではなく、file1相対的であることに注意してくださいfile2

出力は、指定された最初のファイル(この場合)に関連していますfile1


2
私は最初の説明が好きではありません:apples両方のファイルで発生します。
ORマッパー14

1
@ORMapper説明を変更しました。それは今より明確/より良い音になります:)?
polym 14

そうではありませんが、今のところ「似たような行は1つしかありません」と書きましたoranges。間違った例:実際には2つの行がありますが、これらはているだけでなく、まったく同じです。そのうちの1つは読み取りoranges、もう1つは読み取りますapples。また、あなたの説明(純粋に順序に基づく)は、質問(長さに基づく)に関するStéphaneのコメントと矛盾しています-誰が正しいですか?
ORマッパー14

@ORMapper「この場合」とその前の行を忘れていました。このステップでは、同様の行が1つしかありませんでした。理解を深めるために、回答に例を追加します。
polym 14

1
@ORMapperまた、長さベースの回答が正しいことを示す例を教えてください。
ポリム14

8

そこにあります:

$ diff file1 file2
1d0
< apples
2a2
> apples
$ diff file2 file1
1d0
< oranges
2a2
> oranges

8

標準(古い)出力形式では、ファイルが異なる領域でテキストを囲むことなく、ファイル間の違いが表示されます。

たとえば、次の1d0 <(削除)を意味リンゴの第一のラインから削除する必要がfile1あり、2a2 >(APPEND)を意味りんごに追加する必要性をfile22行目に、その両方のファイルを一致させることができます。

で入手可能なドキュメントinfo diffでさらに説明しています。

コンテキストなしで違いを表示する

「通常の」diff出力形式は、周囲のコンテキストなしで、それぞれの違いの塊を示します。時々、そのような出力は、近くの変更されていない行の混乱なしに、行がどのように変化したかを見るための最も明確な方法です(ただし、コンテキストの0行を使用することで同様の結果を得ることができます)。ただし、この形式はパッチの送信に広く使用されなくなりました。そのためには、コンテキスト形式と統一形式が優れています。古い形式diffおよびPOSIX標準との互換性のために、標準形式がデフォルトです。--normalオプションを使用して、この出力形式を明示的に選択します。

通常フォーマットの詳細な説明

通常の出力形式は、1つまたは複数の相違点で構成されています。各ハンクには、ファイルが異なる1つの領域が表示されます。通常の形式のハンクは次のようになります。

 CHANGE-COMMAND
 < FROM-FILE-LINE
 < FROM-FILE-LINE...
 ---
 > TO-FILE-LINE
 > TO-FILE-LINE...

変更コマンドには3つのタイプがあります。それぞれは、最初のファイルの行番号またはコンマで区切られた行の範囲、変更の種類を示す単一の文字、および2番目のファイルの行番号またはコンマで区切られた行の範囲で構成されます。すべての行番号は、各ファイルの元の行番号です。変更コマンドのタイプは次のとおりです。

LaR 最初のファイルの行Lの後に、2番目のファイルの範囲Rの行を追加します。たとえば8a12,15、ファイル1の行8の後にファイル2の行12〜15を追加することを意味します。または、ファイル2をファイル1に変更する場合、ファイル2の12〜15行目を削除します。

FcT 最初のファイルの範囲Fの行を2番目のファイルの範囲Tの行に置き換えます。これは、追加と削除を組み合わせたようなものですが、よりコンパクトです。たとえば5,7c8,10、ファイル1の5〜7行目を変更して、ファイル2の8〜10行目として読み取ることを意味します。または、ファイル2をファイル1に変更する場合、ファイル2の行8〜10を変更して、ファイル1の行5〜7として読み取ります。

RdL 最初のファイルから範囲Rの行を削除します。行Lは、削除されなかった場合に2番目のファイルに現れる場所です。たとえば5,7d3、ファイル1の5〜7行目を削除することを意味します。または、ファイル2をファイル1に変更する場合は、ファイル2の3行目にファイル1の5-7行を追加します。

こちらもご覧ください:


したがって、オレンジを表示するには、並べて表示するか、統合コンテキストを使用して表示する必要があります。

例:

$ diff -y file1 file2
apples                                <
oranges                             oranges
                                  > apples

$ diff -u file1 file2
@@ -1,2 +1,2 @@
-apples
 oranges
+apples
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.