ファイル間の差分を取得する方法

ファイル間の差分を取得する方法

StackOverflow コミュニティで同様のリンクを見つけましたが、私の質問に正確には答えていませんでした。

行数が異なる 2 つのファイルがありますが、両方とも並べ替えられています。元のファイルは数百行の長さですが、トラブルシューティングのために、file1 を 12 行、file2 を 5 行にしました。file2 は file1 のサブセットです。やりたいことは、file1 にはあるが file2 にはないすべての行を出力するコマンドを実行することです。

Unix コマンドを使用しようとしましたがdiffcommどちらも file1 の完全な内容をリストしますが、これは私が望んでいるものではありません。

簡単な例は次のようになります。

File1      File2
A           B
B           E
C           I
E           N
G           O
I
L
M
N
O
X

ここでは、file2 にあるものはすべて file1 にあることがわかります。何らかの理由で、diff両方commとも file1 の完全な内容を表示しました。これは、行ごとに比較しており、ファイル全体を検索していないためだと思います。

期待どおりの出力が得られる別の Unix コマンドはありますか?

編集: 必要なものを取得するために使用したコマンドは次のとおりです。

a) ファイル1とファイル2の差分

これは基本的に、ファイル1のすべてを<で始まり、コンテンツがファイル1からのものであることを示し、ファイル2のすべてを>で始まり、ファイル1からのものを示す。これは明らかに私が必要としていたものではない。

b) 通信 -23 ファイル1 ファイル2

すると、私が期待していた差分ではなく、ファイル1の内容全体が再び表示されました。また、

c) 通信 -3 ファイル1 ファイル2

comm のヘルプ ページには、ファイル 1 の行は印刷されるがファイル 2 の行は印刷されない、またはその逆と書かれていましたが、私の例では、B は両方のファイルに存在しますが、異なる行に表示されているため、これも私が望んでいた結果を示しませんでした。ただし、出力では、B は一方にはあるがもう一方にはないと認識され、印刷されます。そのため、出力は次のようになります。

A
B
    B
C
E
    E
etc.

それは私が期待していたものとは違いました。

A
C
G
L
M
X

答え1

それには、ファイルA内のファイルbの内容を逆順にgrepするだけです。

例 :

francois@zaphod:/tmp$
 cat > A
az
ae
ar
at
ay
au
francois@zaphod:/tmp$
 cat > b
ba
by
ay
at
au
francois@zaphod:/tmp$
  grep -v "$(cat /tmp/b)" /tmp/A
az
ae
ar
francois@zaphod:/tmp$

ここでの出力はファイルAの行のみで、ファイルBには存在しません。

答え2

差分出力には、ファイル X がファイル Y になるために何を行う必要があるかが表示されます。

あなたのコメントによれば、次のワンライナーを使うかもしれません:

cat x y | sort -u  | cat y - | sort | uniq -u

それは

  1. 両方のファイルを読む
  2. 並べ替えて一意の行のみを印刷します(-uソート中)
  3. ファイル(y)を読み取り、パイプ出力と組み合わせる
  4. リゾート出力
  5. uniq を使用すると、一度だけ表示される行 ( -uunique 内) のみが使用されます。

この方法は集合論に基づいています。まず 2 つの集合を加算し、次にそのうちの 1 つを減算します。

答え3

ファイルの 1 つが DOS 形式のテキスト ファイルで、もう 1 つのファイルが Unix 形式のテキスト ファイルである場合、行の文字が同じであっても、各行は他のファイルのすべての行と異なります。これは、1 つのファイルの各行の末尾に追加の復帰文字が存在するためです。この復帰文字は、他のファイルには存在しません。

がUnix テキスト ファイルで が DOS テキスト ファイルのcomm -3 file1 file2場合、次のような出力が期待されます(これが現在のファイルです)。file1file2

A
B
        B
C
E
        E
G
I
        I
L
M
N
        N
O
        O
X

が DOS テキスト ファイルで が Unix テキスト ファイルのcomm -3 file1 file2場合、次のような出力が期待されます。file1file2

A
        B
B
C
        E
E
G
        I
I
L
M
        N
N
        O
O
X

両方のファイルの行末が同じ場合、つまり両方ともDOSテキストファイルまたは両方ともUnixテキストファイルである場合、出力は次のcomm -3 file1 file2ようになると予想されます。

A
C
G
L
M
X

両方のファイルをUnixテキスト形式に変換するには、次のコマンドを使用します。

dos2unix file1 file2

...dos2unixユーティリティがインストールされていることが前提です。

関連情報