脱目視確認DX テキストもバイナリもfcコマンドで簡単・確実差分チェックマウスのいらないコマンドプロンプトの世界

案内状などを送付する際、間違いがないかどうか2つのリストの違いを見つけなければならないことはないだろうか? こんな場合、リストの行を順番に見比べるのは大変。WordやExcelを使ってやれないことはないが、単純なリストの比較なら、コマンドプロンプト上でfcコマンドを使えば一発だ!

» 2021年05月13日 05時00分 公開
[竹内充彦]

この記事は会員限定です。会員登録(無料)すると全てご覧いただけます。

リストの違いを見比べるのはかなり神経を使う作業 リストの違いを見比べるのはかなり神経を使う作業
2つのリストの違いを見つける際、印刷した紙を並べて見比べたり、Excelで列に並べて見比べたりしていないだろうか。1つずつ2つのリストに違いがないかを確認するのはかなり神経を使う。単純なリストなら、コマンドプロンプトを起動し、fcコマンドを使えば一発で終わるぞ!

膨大な量の2つのリストの比較って普段どうしてる?

 膨大な項目からなるリストが収められた2つのテキストファイルがある。もし、その2つの内容が同じかどうかをチェックするとしたら、あなたはどうやるだろうか?

 紙に印刷して、2つのリストを並べ、定規を当てながら行単位で両者を見比べていくというのは、元がデジタルデータなのに、手法がアナログ過ぎる。そもそもリストが数百行、数千行あったとしたら、人間が見比べていくうちにミスが起きかねない。

 こういう正確さが求められる単純作業こそ、コンピュータにやらせるべきだ。

【今回のミッション】

 印鑑を押すためどころか、PCを使うために出社しなければならないという前時代的な当社で、また退社時刻5分前に上司が面倒な仕事を押し付けてきた。

 3カ月後に開催する予定の国際交流イベントを当社がサポートすることになったのだが、出展国を歓迎する意味を込めて各国の国旗を用意することになった。「もし、手配に抜かりがあれば出展国に対して非礼に当たり、外交問題に発展しかねない」と脅された。いや、さすがにそれは大げさだと思うが、確かに不手際があっては相手国に申し訳ない。

 そこで、こちらで取りまとめた参加国リスト「list1.txt」と、手配業者がそこに手を加えた国旗の在庫リスト「list2.txt」とを照合することになった。参加国と地域は200近くある。さて、どうしよう。


 「Microsoft Word(ワード)」には、2つのファイルを比較する、その名も「比較」という機能が用意されている。文書全般を扱う高機能なソフトウェアだけに、この「比較」の機能も至れり尽くせりで、複数のペインを開き、両者の違いを文字単位で示してくれる。

Wordの「比較」を利用した2つのファイルの比較 Wordの「比較」を利用した2つのファイルの比較
Wordにも2つの文書を比較して違いを示してくれる機能がある。高度な編集機能も用意されているため、違いを確認した後で編集するような作業に向いている。

 だが、この機能を利用するには、Wordを起動し、[校閲]タブを選択して、[比較]を実行。[比較]ダイアログボックスから、比較対象となる2つのファイルをそれぞれ[ファイルを開く]ダイアログから指定しなければならない。

 比較的長めの文章で構成された2つのファイルを比較し、必要に応じて文章を修正するのならば、間違いなくWordを使った方が便利である。その方が結果として早く目的を達せられるからだ。しかし、「単純な項目リストの抜けをチェックするだけ」ならば、もっと手軽な方法がある。そちらを使った方が結果として早く目的を達せられる。

 こういうときに頼りになるのがコマンドプロンプトだ。Windows OSには、もともと2つのファイルを比較して両者の差分を行単位で表示してくれる単機能で手軽な「fcコマンド」(fcはFile Compareの意味から)が用意されている。

fc /N list1.txt list2.txt[Enter]


fcコマンドで2つのファイルを比較して差分を出力する

fcコマンドを使って2つのファイルの違いを比較する

 このコマンドを実行すると「list1.txt」と「list2.txt」という2つのファイルを比較し、行単位での違い(以下、不一致行と呼ぶ)を表示してくれる。「/N」は行番号を表示するというオプションスイッチだ。ちなみに、ここでは詳しく解説しないが、/Bオプションを使うと、2つのバイナリファイルの比較も可能だ。新旧のプログラムファイルを比較することもできるわけだ。

 不一致行が多いと、画面がスクロールしてしまい、最初の方の結果がすぐに見えなくなってしまうので、実際に使うときには、パイプラインでmoreコマンドに渡すか、リダイレクト(>)で別ファイルに保存するとよいだろう。

fc /N list1.txt list2.txt | more[Enter]


fcコマンドの出力をmoreコマンドによりページ単位で表示する

fc /N list1.txt list2.txt > difference.txt[Enter]


fcコマンドの出力をリダイレクトで「difference.txt」に出力する

fcコマンドで2つのファイルを比べて差分を確認する fcコマンドで2つのファイルを比べて差分を確認する
fcコマンドは指定した2つのファイルを比較して、両者の差分を表示してくれる。

 なお、このとき、行番号は論理行を基準に表示されることに注意しよう。論理行とは、画面に表示される物理的な行ではなく、[Enter]キーで入力される改行コードまでの一連の文字列を1行として数えたときの行番号である。画面上は複数行に渡る文章も、論理行では改行までなので1行になる。

fcコマンドの出力結果を読み取るコツ

 fcコマンドは、使い方はとても簡単だが、結果表示を読み取るのに若干のコツが必要なので、ここで紹介しておこう。

 fcコマンドでは、基本的に2つのファイルの不一致行を、共通する部分(以下、一致行と呼ぶ)で挟む形式で表示する。

fcコマンドの出力形式 fcコマンドの出力形式
fcコマンドが差分を表示する際、原則として前後の一致行で、不一致行を挟む形式で表示する。

 では表示結果の具体例を見ていこう。まず、一方のファイルには存在するが他方のファイルには存在しない場合の表示だ。結果は分かりやすく、どちらのファイルのどの行が抜けているのかが一目瞭然だ。

一方にある項目が他方にない場合 一方にある項目が他方にない場合
この例では「赤道ギニア」と「エチオピア」が双方のファイルに存在する一致行。間に挟まれる部分が2つのファイルの差分であることを示している。

 次に、同じ(とfcが判断した)行は存在するが、内容に違いがあるという例だ。この場合、一致行に挟まれた行数が同じなだけに、いちべつしただけでは違いを見つけにくい。

同じ項目の内容に違いがある場合 同じ項目の内容に違いがある場合
残念ながら、fcコマンドは行内の「ここが違っている」というところまでは示してくれない。上記の2つ目の例では、不一致行として3行表示されているが、実際に内容が違っているのはそのうちの2行だ。

 上記の例で、なぜ真ん中の1行は内容が同じなのに不一致行として扱われているのだろうか。実は、fcコマンドでは、2行以上連続して一致しなければ、それらはまとめて不一致行として扱われてしまうのだ。

 なお、一致行と認識するための連続行数を変更するには、オプションスイッチ「/<数字>」を指定する。例えば、1行でも一致すれば一致行と見なすようにしたければ次のように指定する。

fc /N /1 list1.txt list2.txt[Enter]


1行でも一致すれば一致行と見なす

 また、前後に一致行が表示されないケースもある。それはファイルの先頭行や末尾行に違いがある場合だ。先頭行の前に行はないし、末尾行の後にも行がないので、これは仕方がないが、結果を見誤らないようにしなければならない。

先頭行や末尾行に違いがある場合 先頭行や末尾行に違いがある場合
末尾の行が違っている場合、当然だが、それ以降に一致行が見つからないため一致行は表示されない。先頭行や最終行の不一致を見逃してしまわないように注意しよう。

データの並び順をそろえてからfcを使う

 fcコマンドは、元データとなる2つのファイルの内容の並び順が異なるだけで、不一致と見なしてしまう。そのため、差分を詳しく検証してみたら、順序が違うだけで、両方に含まれる情報は同じだったということもある。もちろん、プログラムリストのように並び順に大きな意味を持つデータも世の中にはたくさんあるので、fcコマンドが役立つシーンは想像以上に多い。

 しかし、日常業務の中には、順不同の2つのファイルの情報が同じかどうかを知りたいというケースも多い。そういう場合はどうすればよいのだろうか。

同じ情報だが並び順が違うファイル 同じ情報だが並び順が違うファイル
実は「ドイツ」のある/なしが違うだけで、他の情報は同じだが、並び順がまるで違う。この2つのファイルをfcコマンドで比較しても、全ての行が不一致行として扱われてしまう。

 こういう時こそ複数のコマンドを連携させればいい。この場合は、あらかじめsortコマンドで元データの順序を並べ替えた比較用のファイルを作成しておき、fcコマンドを実行する。

sort list3.txt > list3-srt.txt[Enter]
sort list4.txt > list4-srt.txt[Enter]
fc /N list3-srt.txt list4-srt.txt[Enter]


事前にsortコマンドを使って並び順をそえる

sortコマンドで並び順を整えてfcコマンドを実行する(1) sortコマンドで並び順を整えてfcコマンドを実行する(1)
並び順をそろえない状態でfcコマンドを実行すると、全ての行が不一致行になってしまう。
sortコマンドで並び順を整えてfcコマンドを実行する(2) sortコマンドで並び順を整えてfcコマンドを実行する(2)
sortコマンドで事前に並び順をそろえておけば、差分は「ドイツ」だけということが一目で分かる結果に。

 以上のように、多少、結果の読み取りにコツが必要だったり、データによっては使い方にもコツが必要だったりするが、単純なリストを比べて違いを知るという目的ならば、fcコマンドが短時間で手軽に結果を手に入れられることがお分かりいただけたのではないだろうか。

今回紹介したコマンド

fc、more、sort、|(パイプ)、>(リダイレクト)


Copyright© Digital Advantage Corp. All Rights Reserved.

スポンサーからのお知らせPR

注目のテーマ

4AI by @IT - AIを作り、動かし、守り、生かす
Microsoft & Windows最前線2025
AI for エンジニアリング
ローコード/ノーコード セントラル by @IT - ITエンジニアがビジネスの中心で活躍する組織へ
Cloud Native Central by @IT - スケーラブルな能力を組織に
システム開発ノウハウ 【発注ナビ】PR
あなたにおすすめの記事PR

RSSについて

アイティメディアIDについて

メールマガジン登録

@ITのメールマガジンは、 もちろん、すべて無料です。ぜひメールマガジンをご購読ください。