Linux join コマンド:ファイルの結合

LinuxBeginner
オンラインで実践に進む

はじめに

この実験では、Linux の join コマンドを使用して、複数のファイルからデータをマージ(結合)する方法を学びます。ここでは、企業の人事部門で働いており、異なるデータベースから従業員情報を統合する必要があるというシナリオを想定します。この実践的な演習を通じて、データ処理タスクにおける join コマンドの強力さと柔軟性を体験してください。

データファイルの確認

まずは、使用する従業員データファイルの内容を確認しましょう。employees.txtsalaries.txt の 2 つのファイルがあります。

最初に、プロジェクトディレクトリに移動します。

cd /home/labex/project

このコマンドにより、現在の作業ディレクトリが /home/labex/project に変更されます。以降のすべての操作はこのディレクトリ内で行われます。

次に、employees.txt の内容を表示してみましょう。

cat employees.txt

cat コマンドはファイルの内容を表示します。以下のような出力が表示されるはずです。

1001 John Engineering
1002 Sarah Marketing
1003 Mike Sales
1004 Emily HR
1005 David Finance

各行は、従業員の ID、名前、所属部署を表しています。

続いて、salaries.txt を確認します。

cat salaries.txt

出力は以下のようになります。

1001 75000
1002 65000
1003 70000
1004 60000
1005 80000

このファイルには、従業員 ID とそれに対応する給与が含まれています。

これらのファイルは別々のデータベースを模しており、これらを join コマンドを使って統合していきます。

基本的な結合操作

データの内容を把握できたので、join コマンドを使用して、従業員 ID をキーにして両方のファイルの情報をマージしてみましょう。

次のコマンドを実行してください。

join employees.txt salaries.txt

以下のような出力が表示されます。

1001 John Engineering 75000
1002 Sarah Marketing 65000
1003 Mike Sales 70000
1004 Emily HR 60000
1005 David Finance 80000

何が起きたのかを解説します:

  1. join コマンドは、両方のファイルの最初のフィールド(従業員 ID)を確認しました。
  2. 一致する ID が見つかると、両方のファイルの行を結合しました。
  3. 出力には、従業員 ID に続いて、employees.txt のすべてのフィールド、そして salaries.txt のすべてのフィールド(重複を避けるため ID 以外)が表示されています。

これにより、各従業員の完全な情報を 1 行で確認できるようになりました。join コマンドは、データが複数のファイルに分散しているが、それらをまとめて表示したり分析したりしたい場合に非常に便利です。

出力フォーマットのカスタマイズ

出力されるフィールドの順序を変更したり、特定のフィールドだけを含めたい場合があります。その場合は、join コマンドの後にフィールド番号を指定することで実現できます。

次のコマンドを試してみましょう。

join -o 1.2,1.3,2.2,1.1 employees.txt salaries.txt

出力は以下のようになります。

John Engineering 75000 1001
Sarah Marketing 65000 1002
Mike Sales 70000 1003
Emily HR 60000 1004
David Finance 80000 1005

-o オプションの詳細を説明します:

  • -o は「出力フォーマット(output format)」を指定します。
  • 1.2 は 1 番目のファイルの 2 番目のフィールド(名前)を意味します。
  • 1.3 は 1 番目のファイルの 3 番目のフィールド(部署)を意味します。
  • 2.2 は 2 番目のファイルの 2 番目のフィールド(給与)を意味します。
  • 1.1 は 1 番目のファイルの 1 番目のフィールド(従業員 ID)を意味します。

これにより、出力情報の順序を自由にカスタマイズできます。特定のレポート形式に合わせてデータを並べ替えたり、各ファイルから必要なフィールドだけを抽出したりする場合に特に役立ちます。

一致しないレコードの処理

実際の業務では、一方のファイルには存在するが、もう一方のファイルには対応するデータがないレコードが含まれることがあります。給与がまだ設定されていない新しい従業員を追加して、この状況をシミュレートしてみましょう。

employees.txt に新しい従業員を追加します。

echo "1006 Alex IT" >> employees.txt

>> 演算子は、既存の内容を上書きせずに、ファイルの末尾に新しい行を追記します。

ここで、基本的な結合コマンドを実行してみます。

join employees.txt salaries.txt

Alex のデータが salaries.txt に存在しないため、出力に Alex が表示されないことに気づくでしょう。

一致しないレコードも含めて表示するには、-a オプションを使用します。

join -a 1 employees.txt salaries.txt

これで、出力に Alex が含まれるようになります。

1001 John Engineering 75000
1002 Sarah Marketing 65000
1003 Mike Sales 70000
1004 Emily HR 60000
1005 David Finance 80000
1006 Alex IT

-a 1 オプションは、1 番目のファイル(employees.txt)にある、ペアが見つからない行も出力するように join に指示します。これは、対応するデータが他方のファイルになくても、特定のファイルの全レコードを確認したい場合に便利です。

異なるフィールドでの結合

これまでは、最初のフィールド(従業員 ID)に基づいてファイルを結合してきました。しかし、別のフィールドに基づいて結合したい場合はどうすればよいでしょうか?ファイルの構成が異なっていたり、ID 以外の共通属性に基づいてデータをマージしたりする必要がある場合に、この手法が役立ちます。

部署コードが含まれる departments.txt という新しいファイルを作成しましょう。

cat << EOF > departments.txt
Engineering ENG
Marketing MKT
Sales SLS
HR HRS
Finance FIN
IT ITS
EOF

このコマンドは、部署名とその対応するコードを含む departments.txt ファイルを作成します。

次に、部署名をキーにして employees.txt と結合してみましょう。

join -1 3 -2 1 employees.txt departments.txt

出力は以下のようになります。

Engineering 1001 John ENG
Marketing 1002 Sarah MKT
Sales 1003 Mike SLS
HR 1004 Emily HRS
Finance 1005 David FIN
IT 1006 Alex ITS

コマンドの解説:

  • -1 3 は、1 番目のファイル(employees.txt)の 3 番目のフィールドを結合キーとして使用することを指定します。
  • -2 1 は、2 番目のファイル(departments.txt)の 1 番目のフィールドを結合キーとして使用することを指定します。

これにより、最初の列に限らず、任意の共通フィールドに基づいてファイルを結合できます。ファイルの構造が異なっていても、共通の情報が含まれていればデータを統合することが可能です。

まとめ

この実験では、Linux の join コマンドを使用して複数のファイルからデータをマージする方法を学びました。join の主な機能について以下の点を確認しました:

  • 共通フィールドに基づいた 2 つのファイルの基本的な結合
  • -o オプションを使用した出力順序のカスタマイズ
  • -a オプションを使用した一致しないレコードの保持
  • -1 および -2 オプションを使用した、1 列目以外のフィールドでの結合

この実験では触れませんでしたが、他にも以下のような join オプションがあります:

  • -t CHAR: 入出力のフィールド区切り文字として CHAR を使用する
  • -i: フィールドの比較時に大文字と小文字の違いを無視する
  • -e STRING: 欠落している入力フィールドを STRING で置き換える
  • -j FIELD: -1 FIELD -2 FIELD と同等
  • -v FILE_NUMBER: -a FILE_NUMBER と同様だが、結合に成功した行を表示しない

join コマンドは Linux におけるデータ処理の強力なツールであり、複数のソースからの情報を効率的に組み合わせることができます。Linux 環境でデータを扱う際は、異なるファイルからの情報をマージ・分析するための貴重な手段として join を活用してください。