BLOGTIMES
2017/03/23

join コマンドを使ってテキストファイルを結合する

  cli 
このエントリーをはてなブックマークに追加

GNU coreutils にはたくさんの便利なコマンドが含まれています。

シェルスクリプトにも良く出てくる sortuniq なんかもそのひとつですが、今回はちょっとマイナーな join を取り上げます。
実はこれを使うとテキストファイルでデータベースの表結合のような処理を簡単に行うことができます。

例えば以下のような ID と名前が書かれたファイルと、ID と成績が書かれたファイルがあるとします。
これを使って成績表を作りたいときに、実は join が使えると一撃で処理が可能です。

member.txt

1 松尾真奈美 2 尾形長次郎 3 山川和雄 4 外山心優 5 岩田和臣 6 浅田亜依 7 黒沢勇二 8 宮原広昭 9 北野喜三郎 10 桑原唯菜

grade.txt

2 S 4 C 8 D 3 C 6 A 1 A 9 C 7 S

これらのファイルではキーが先頭にあるので、以下のようにすることで結果を得ることができます。
デフォルトでは INNER JOIN のように結合可能された行だけが表示されます

$ join <(sort -k 1,1 member.txt) <(sort -k 1,1 grade.txt) 1 松尾真奈美 A 2 尾形長次郎 S 3 山川和雄 C 4 外山心優 C 6 浅田亜依 A 7 黒沢勇二 S 8 宮原広昭 D 9 北野喜三郎 C

ちなみにファイルを sort しているのは、キーが昇順でソートされていないとエラーが出てしまうから。これについてはマニュアルの 8.3.2 Pre-sorting にも記載があります。

ソースを読んだわけではありませんが、これは内部が伝統的なマッチング処理になっているからでしょうか。こういう話はホストで COBOL をいじったことがある年代の人ならばピンとくるかもしれませんが、SQL 全盛になってからはマッチング処理を自分で書くこともなくなってしまいましたからね。

$ join member.txt grade.txt 2 尾形長次郎 S 4 外山心優 C join: grade.txt:4: is not sorted: 3 C 8 宮原広昭 D join: member.txt:10: is not sorted: 10 桑原唯菜 9 北野喜三郎 C

ちなみに OUTER JOIN のように 結合されない行も含めて表示したいときは -a オプションを使います。
LEFT OUTER JOIN の場合には 1 、RIGHT OUTER JOIN の場合には 2 を指定する必要があります。

$ join <(sort -k 1,1 member.txt) <(sort -k 1,1 grade.txt) -a 1 1 松尾真奈美 A 10 桑原唯菜 2 尾形長次郎 S 3 山川和雄 C 4 外山心優 C 5 岩田和臣 6 浅田亜依 A 7 黒沢勇二 S 8 宮原広昭 D 9 北野喜三郎 C

マイナーなコマンドですが覚えておくと役に立ちます。


    トラックバックについて
    Trackback URL:
    お気軽にどうぞ。トラックバック前にポリシーをお読みください。[policy]
    このエントリへのTrackbackにはこのURLが必要です→https://blog.cles.jp/item/9229
    Trackbacks
    このエントリにトラックバックはありません
    Comments
    愛のあるツッコミをお気軽にどうぞ。[policy]
    古いエントリについてはコメント制御しているため、即時に反映されないことがあります。
    コメントはありません
    Comments Form

    コメントは承認後の表示となります。
    OpenIDでログインすると、即時に公開されます。

    OpenID を使ってログインすることができます。

    Identity URL: Yahoo! JAPAN IDでログイン