Section Next | Prev


5.2.3 ファイルの突き合わせ(diff, cmp, comm)

ファイルを比較し、同じ内容かどうかを判定したり、 その差分を抽出するといったファイルの突合せについて解説します。 UNIX はAT&T Bell Lab.で文書管理システムに利用されていた経緯があり、 文書の差分や履歴管理といった機能を豊富にもちます。
ここでは diff, cmp, comm を取り上ます。


diff

【機能説明】
diff はファイルの差分を解析し、その差異を表示するだけでなく、 相違点を解消するためのエディタスクリプトを出力することができます。 その為、ソースプログラムのパッチを作成する為に用いられる事があります。

【入力フォーマット】
diff [ オプション ] ファイル1 ファイル2

【主なオプション】
-c
冗長な表記
-e
file1 から file2 を作成できるような ed コマンドを出力

【実行例】
# 元データの確認(以下、他の実行例でも共通)
$ ls -l a.txt b.txt
-rw-r--r--  1 ycos users 37 Oct	 6 21:46 a.txt
-rw-r--r--  1 ycos users 25 Oct	 6 21:48 b.txt
$ cat a.txt
This is File A
same DATA
End of file
$ cat b.txt
This is File B
same DATA

# ファイルの比較
$ diff a.txt b.txt
1c1
< This is File A
---
> This is File B
3d2
< End of file

# ファイルの比較(冗長な表示)
$ diff -c a.txt b.txt
*** a.txt	Sat Oct	 6 21:46:58 2007
--- b.txt	Sat Oct	 6 21:48:39 2007
***************
*** 1,3 ****
! This is File A	# ! は変更箇所
  same DATA
- End of file		# - はb.txt に含まれない行
--- 1,2 ----
! This is File B
  same DATA

# a.txt を b.txt と同じ内容にするための edコマンドスクリプトの生成
# このスクリプトは最終的に上書きをしない内容であるため、
# 必要であれば更新、表示するためのコマンドを追加する必要がある
$ diff -e a.txt b.txt
3d
1c
This is File B
.

# ed 用スクリプトの生成、印刷コマンドを追加
$ diff -e a.txt b.txt > c.ed
	(最後にコマンドを追加 1,$p)
$ cat c.ed
3d
1c
This is File B
.
1,$p	# 手で追加した行。ファイル内容を表示

$ ed a.txt < c.ed
37
This is File B
same DATA
?

cmp

【機能説明】
cmp はファイルの内容が同じかどうかを判定します。 また最初に差異を検出した場所を表示します。
文字単位で2つのファイルを比較し、異なった時点で処理を終了するため 他のコマンドに比べ実行時間が短いとう特徴があります。

【入力フォーマット】
cmp [ オプション ] ファイル1 ファイル2

【主なオプション】
-s
ファイルの内容が同じかどうかの比較だけを行います。同一であれば0、異なる場合は1を返します。
-l
最初に見つかった相違点の位置(行数、文字数)とその値を表示します。

【実行例】
ことを表しています。
# 1行目、14桁目のデータが異なる。
$ cmp a.txt b.txt
a.txt b.txt differ: char 14, line 1

# 14桁目のデータは8進数で(101:A)と(102:B)である。
# また b.txt の方が小さい(先にファイルの終了を検出)
$ cmp -l a.txt b.txt
    14 101 102
    cmp: EOF on b.txt

# ファイルが異なる時は1、同じときは0を返す
$ cmp -s a.txt b.txt ; echo $?
1
$ cmp -s a.txt a.txt ; echo $?
0


comm

【機能説明】
comm はファイルを比較して、「ファイル1にしかないもの」、「ファイル2にし かないもの」、「両方にあるもの」に分類して表示します。

【入力フォーマット】
comm [ オプション ] ファイル1 ファイル2

【実行例】
オプションには 1, 2, 3 が指定でき、それぞれファイル1にしかないもの、ファ イル2にしかないもの、両方にある物の表示を抑制します。
$ comm a.txt b.txt
This is File A			# a.txt にだけある行
        This is File B		# b.txt にだけある行
                same DATA	# 両方にある行
End of file

$ comm -3 a.txt b.txt
This is File A
        This is File B
End of file

$ comm -23 a.txt b.txt
This is File A
End of file

Section Next | Prev

Copyright 2007-2018 ycosSystems Misc/Body523.html