Linuxコマンドjoin 使い方と4つのオプション

Linuxコマンドjoinは、2つのファイルを特定の列に基づいて結合する必要がある場合、データベースの”JOIN”機能に似た方法で、2つのファイルを効率的に結合することができます。今回は、joinコマンドの使い方と便利なオプションについて紹介します。

Linuxコマンドjoinとは?

joinは、2つのファイルの共通フィールドを基準にデータを結合するコマンドです。主に、各ファイルの行データを特定の列に基づいてマージし、出力する際に使用されます。このコマンドは、データベースでよく使われるJOIN操作と同じ役割を果たします。

joinコマンドは、2つのファイルがソートされた状態でのみ正しく機能するため、コマンドを使用する前に、sortコマンドでデータを整列させることが必須です。

joinコマンドの基本構文

join [options] file1 file2
ShellScript

joinコマンドは、基本的に2つのファイルを入力として受け取り、最初のフィールドを基準にデータをマージします。ここで言うフィールドとは、ファイルの各行を構成する列のことです。2つのファイルで共通するフィールドの値が一致した場合、その行が結合されて出力されます。

join file1.txt file2.txt
ShellScript

以下の例のように、スプレッドシート形式のように、各ファイルの最初のフィールドを基準にデータが結合され、1つの出力として表示されます。

図1. Linuxコマンドjoin: 最初のフィールドに基づいたデータの結合
図1. Linuxコマンドjoin: 最初のフィールドに基づいたデータの結合

便利なオプション

joinコマンドには様々なオプションがあり、ファイルの結合を柔軟に行うことができます。よく使うオプションのいくつかを紹介します。

-1, -2 オプション: 基準フィールドの変更

基本的にjoinは、2つのファイルの最初のフィールドを基準にデータを結合します。しかし、ファイルによって基準となるフィールドが異なる場合があります。このとき、-1と-2オプションを使用して、それぞれのファイルでどのフィールドを基準に結合するかを指定できます。

join -1 2 -2 1 file1.txt file2.txt
ShellScript

ここで、-1 2は1つ目のファイルの2つ目のフィールドを、-2 1は2つ目のファイルの最初のフィールドを基準に結合するという意味です。以下は、-1 1で最初のファイルの1つ目のフィールド、-2 2で2つ目のファイルの2つ目のフィールドを基準に結合した結果です。

図2. Linuxコマンドjoin: 基準となる列が異なる場合の結合方法
図2. Linuxコマンドjoin: 基準となる列が異なる場合の結合方法

-t オプション: 区切り文字の設定

基本的にjoinコマンドは、空白をフィールドの区切り文字として使用します。しかし、ファイル内でコンマ(,)やタブ(\t)などの異なる区切り文字が使用されている場合があります。このとき、-tオプションを使用して区切り文字を指定できます。

join -t ',' file1.csv file2.csv
ShellScript

この例では、ファイルがコンマで区切られたCSVファイルである場合、各フィールドを正確に認識して結合します。また、以下の図のように、結合された結果もコンマで区切られて返されます。

図3. Linuxコマンドjoin: フィールド区切り文字を指定してCSVファイルを結合
図3. Linuxコマンドjoin: フィールド区切り文字を指定してCSVファイルを結合

-a オプション: 一致しない行も出力

joinコマンドは基本的に、2つのファイルで共通するフィールドの値が一致する行だけを出力します。しかし、-aオプションを使用すると、一致しない行も出力することができます。このとき、-a 1は1つ目のファイルの全ての行を、-a 2は2つ目のファイルの全ての行を出力します。

join -a 1 file1.txt file2.txt
ShellScript

このコマンドは、1つ目のファイルのすべての行を出力し、2つ目のファイルで一致するフィールドがある場合にのみ結合された値を出力します。

図4. Linuxコマンドjoin: -aオプションを使用してfile2.txtで一致する場合のみ出力
図4. Linuxコマンドjoin: -aオプションを使用してfile2.txtで一致する場合のみ出力

今回は、2つのファイルの全てのフィールドの値をマージした結果です。

図5. Linuxコマンドjoin: -aオプションを使用してfile2.txtで一致しない場合も全て出力
図5. Linuxコマンドjoin: -aオプションを使用してfile2.txtで一致しない場合も全て出力

-v オプション: 一致しない行のみを出力

逆に、2つのファイルで一致しない行だけを確認したい場合は、-vオプションを使用します。-v 1は1つ目のファイルにしか存在しないデータを、-v 2は2つ目のファイルにしか存在しないデータを出力します。以下のコマンドは、1つ目のファイルにしかなく、2つ目のファイルにはないデータを出力します。

join -v 1 file1.txt file2.txt
ShellScript

以下は、-v 1オプションを使用してfile1.txtにしかないデータを出力した結果と、-v 1 -v 2オプションを使用してfile1.txtとfile2.txtの一致しない全てのデータを出力した結果です。

図6. Linuxコマンドjoin: -vオプションで一致しない行のみ出力
図6. Linuxコマンドjoin: -vオプションで一致しない行のみ出力

注意事項

区切り文字の一致

joinコマンドは、基本的に一致するフィールドを基準にマージするため、一致しないフィールドは除外されます。以下の図では、file1.txtの3 treeとfile2.txtの4 grassの基準フィールドが一致しないため、出力されていないことが分かります。

図7. Linuxコマンドjoin: 一致しない行は出力されない
図7. Linuxコマンドjoin: 一致しない行は出力されない

ファイルのソート

joinコマンドを使用する前に、必ず2つのファイルを同じ基準フィールドでソートする必要があります。ソートされていない状態でコマンドを実行すると、”join: input is not in sorted order”というエラーメッセージが表示され、ソートが行われていないことが指摘されます。このため、sortコマンドを利用してファイルを整列させてから使用する必要があります。

図8. Linuxコマンドjoin: 基準フィールドがソートされていない場合
図8. Linuxコマンドjoin: 基準フィールドがソートされていない場合

区切り文字の一貫性

ファイル間で区切り文字が異なると、joinコマンドが正しく動作しない可能性があります。区切り文字を一貫して使用するか、-tオプションを使って区切り文字を明示することをお勧めします。

フィールドの数

joinコマンドは、フィールドの数が異なるファイルを結合する場合、予期しない結果をもたらすことがあります。2つのファイルのフィールド数を確認し、必要に応じて事前にデータを処理することが重要です。

まとめ

joinコマンドは、Linux環境で2つのファイルを特定のフィールドに基づいて結合する際に非常に便利なツールです。特に、大量のデータを処理する場合には必須の機能の一つであり、多彩なオプションを活用することで、より柔軟にデータを扱うことができます。ただし、使用する前にファイルがソートされているか、区切り文字が一貫して設定されているかを確認することが重要です。

joinコマンドをうまく活用すれば、データベースのJOIN機能をLinuxファイルシステムでも簡単に実現でき、さまざまな状況で有効に活用することができるでしょう。

リファレンス

関連ポスト

コメントする