
2つのファイルが与えられたら、各ファイルの各行に対して実行する方法comm
そしてdiff
決める
- この行が他のファイルにも表示されますか?
- もしそうなら、両方のファイルで同じように表示されますか、それとも別々に表示されますか?
各ファイルの行間の順序を考慮しますか?
diff
「2つのファイルでは発生しますが別の行」または「1つのファイルでは発生しますが、別のファイルでは発生しません」を確認する方法は?
両方のファイルを減算するために両方が使用されている場合はcomm
どう違いますか?diff
ありがとうございます。
(一部の初等数学に興味がない場合は、以下を無視してください。上記は、私の質問に関する限り独立しています。)
私は推測する:
数学では、セットは要素間に順序を付けません。 (このようなセットをシーケンスセットと呼びますが、これは別の概念です)
「S1〜S2」、すなわち、2つのセットS1とS2の差分セット演算は、第1セットの要素セットを生成するが、第2セットの要素セットは生成しない。
両方のセットの交差点を見つけるときに要素が両方のセットで考慮される場合、各セット内でその要素が表示される場所は重要ではありません。
ファイルに違いを設定するなどの操作もあります。comm
coreutilsからそしてdiff
diffutilsから。ただし、ファイルを行セットとして考えることはできませんが、行は自然に行番号でソートされるため、ソートされた行セットと考えることができます。
また、さまざまな方法で作業しますcomm
。diff
概念レベル(入力レベルと出力レベル)でそれぞれ実行されているタスクcomm
と実行したいタスクは何ですかdiff
?数学的にも説明できれば、より明確になります(注文セットに関する基本的な知識が必要な場合があります)。実装レベルでは説明を期待していませんが、役に立ちます(一部のバージョン管理およびバックアップソフトウェアは増分コピーに同じまたは類似のアルゴリズムを使用します)。
ありがとうございます。
答え1
ここに記載されているように。 https://en.m.wikipedia.org/wiki/Diff
「diff演算は、最も長い共通部分修飾問題を解くことに基づいています。」
コメントで指摘したように、わずかに異なるバリエーション(diff、gdiff、vimdiff、git-diff、rdiff-backupなど)を持ついくつかの実装があります。 LCS Wikiページには、あなたが要求した数学的な定義があります。 2つのソートされたセットからすべてのLCSを減算すると、その差が残りになります。
答え2
実装の一般的な問題
diff
は、削除または挿入が検出された後に次の共通テキストブロックを見つけることです。
有用な結果を得るには、実装時に共通コードが1行後に再同期を検出するのか、それともより多くの共通コードが必要かを判断する必要があります。
その理由は、挿入後にすでに存在する行と同じ単一の行を挿入に含めることができるためです。単一の同じ行が再同期を検出するために使用される場合、diff出力は、予想されたものとは異なる複数の挿入にフラグを立てます。
しかし発見最も長い共通文字列アルゴリズムではなく問題であり、問題に対する解決策(アルゴリズム)がいくつかあります。
find
このコマンドは、Douglas McIllroyが1974年にUNIX用に作成した元のアルゴリズムを使用します。
もう1つの有名ですがまったく異なる実装(別のアルゴリズムを使用)は、1980年代後半に誰かがGNU用に書いていました。
再同期化アルゴリズムが完全に異なるため、両方の実装は場合によっては異なる結果を提供することが知られています。
diff
UNIXが最小コードサイズの元の最適化を使用していた限り、GNUはUNIXよりも高速でしたが、diff
数diff
年前、私はdiff
UNIX実装の最適化をコードサイズに関係なくできるだけ早く変更しました。一般的な目的でUNIXを使用している限り、ファイルサイズに応じてUNIXはdiff
GNUより高速です。diff
Douglas McIllroyが使用したアルゴリズムは、彼の大学のホームページに文書化されています。http://www.cs.dartmouth.edu/~doug/diff.pdf
興味深いことに、diffを見つける反対のプロセスは、diff出力を使用して元のファイルにパッチを適用してファイルの新しいバージョンを取得することです。
SCCS
この問題に対する最初の解決策は、1972年にBell LabsのMarc J. Rochkindが発明したプログラムでした。彼の説明を見てください。http://sccs.sourceforge.net/sccs_invention.htmlsccsホームページから:http://sccs.sourceforge.net/diffの必要性のために、sccs
1974年以前は古くなっていましたが、あまり賢くない実装がありましたdiff
。
すべての可能なバージョンのストリームを単一のファイルに含めることができるため、ファイルのパッチを回避するSCCS
非常に賢いファイル形式を使用してください。weave
ファイルから単一のランダムバージョンを抽出すると、抽出したいweave
バージョンによって時間が変わらず、常に同じ速度で完了します。