DESIGN / CODE / INFRA / AI

解説

二つの一覧の差と共通分を出す:sort -uとcommを練習しよう

一覧Aだけ、Bだけ、両方にある項目を分けて確認。並べ方をそろえる条件と、重複回数・元の順番を残す処理との違いを整理する。

二つの一覧の差と共通分を出す:sort -uとcommを練習しよう
保存リストを見る →
この記事の道しるべ 4項目

二つの項目一覧を比べ、片方にしかないものと、共通のものを知りたい。GNUのcommは、並べ替え済みの二つのファイルを比べられるよ。

今回はBashとGNU coreutilsで、架空の単語の一覧を使う。新しい空の練習フォルダーを用意し、実際のメールアドレスなどは使わない。

重複を一つにし、同じ条件で並べる

printf 'apple\npear\npear\n' > a.txt
printf 'pear\nplum\n' > b.txt
LC_ALL=C sort -u a.txt > a.sorted.txt
LC_ALL=C sort -u b.txt > b.sorted.txt

-uで、同じ行を一つにした一覧を作る。今回は各単語があるかどうかを比較する目的で、pearがAに2回出る情報は残さない。元の登場順も、並べ替えた出力では保持しないよ。

元のa.txtとb.txtを直接上書きせず、別のファイルへ保存する。入力と同じ名前へ>で書き出すと、読み込む前に中身を失う原因になるので注意してね。

Aだけ、Bだけ、両方をそれぞれ出す

LC_ALL=C comm -23 a.sorted.txt b.sorted.txt
LC_ALL=C comm -13 a.sorted.txt b.sorted.txt
LC_ALL=C comm -12 a.sorted.txt b.sorted.txt

期待する表示は、順にapple、plum、pear。それぞれ一行になるよ。-23は第2・第3列、-13は第1・第3列、-12は第1・第2列を表示しない指定だね。

残す内容 指定 今回の結果
Aだけ -23 apple
Bだけ -13 plum
共通 -12 pear

引数の順番を逆にすると、AだけとBだけの意味も逆になる。ファイル名だけでなく、左右に何を置いたかを確認しよう。

ソートと比較の条件をそろえる

commは、比較する順番に合うソート済みの入力を前提とする。今回はsortにもcommにもLC_ALL=Cを付け、ASCIIの単語を同じ条件で扱う。

別の言語の照合や、大文字・小文字を無視する条件を混ぜる場合は、準備と比較が対応しているかを確認する必要があるよ。未ソートのまま結果が出ても、正しい集合の比較ができたとは扱わないようにしよう。

件数の差を知る処理とは違う

今回のAにはpearが二つあったが、一つにしてから比較している。出現回数の増減や、どの順番に並んでいたかは、この結果だけでは分からない。

一行一項目という前提も大切。CSVの引用符内の改行や、特殊なファイル名などを、そのまま単純な行の一覧とみなさないようにしよう。

編集部では、一時フォルダーでAのみ・Bのみ・共通の三つの結果、重複の除去、元ファイルの保持を確認した。大量の実データや、すべてのロケールを比べた検証ではないよ。

回数を数える場合はsortとuniq -c、二つの文章の変更箇所を読む場合はgit diff --no-indexも使い分けてみよう。

参考・出典

公開と変更の記録
  • :初回公開

日時は日本時間です。記載のある変更は、確認できた編集記録に基づきます。更新日の違いだけから変更内容を推測して載せることはありません。

更新・訂正の方針 →

みんなのコメント 0

感想や、試してみたことを聞かせてね。コメント・返信は承認後に公開されます。

最初のコメントをどうぞ。