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

LinuxLinuxBeginner
今すぐ練習

💡 このチュートリアルは英語版からAIによって翻訳されています。原文を確認するには、 ここをクリックしてください

はじめに

この実験では、Linux の join コマンドを使って複数のファイルからのデータを結合する方法を学びます。企業の人事部署で作業しており、異なるデータベースからの社員情報を結合する必要があるシナリオをシミュレートします。この実践的な演習は、データ処理タスクに対する join コマンドの威力と柔軟性を示します。


Skills Graph

%%%%{init: {'theme':'neutral'}}%%%% flowchart RL linux(("Linux")) -.-> linux/FileandDirectoryManagementGroup(["File and Directory Management"]) linux(("Linux")) -.-> linux/TextProcessingGroup(["Text Processing"]) linux/FileandDirectoryManagementGroup -.-> linux/cd("Directory Changing") linux/TextProcessingGroup -.-> linux/join("File Joining") subgraph Lab Skills linux/cd -.-> lab-219193{{"Linux の join コマンド:ファイルの結合"}} linux/join -.-> lab-219193{{"Linux の join コマンド:ファイルの結合"}} end

データファイルの理解

まず、社員データファイルの内容を調べましょう。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 コマンドを使って結合する別個のデータベースを表しています。

基本的な結合操作

データを理解したので、社員IDを基に両方のファイルの情報を結合するために join コマンドを使いましょう。

次のコマンドを実行します。

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 は「出力形式」を意味します。
  • 1.2 は最初のファイルの2番目のフィールド(名前)を意味します。
  • 1.3 は最初のファイルの3番目のフィールド(所属部署)を意味します。
  • 2.2 は2番目のファイルの2番目のフィールド(給与)を意味します。
  • 1.1 は最初のファイルの1番目のフィールド(社員ID)を意味します。

これにより、出力内の情報の順序をカスタマイズすることができます。特定のレポート形式にデータを並べ替える必要がある場合や、各ファイルから特定のフィールドのみが必要な場合に特に便利です。

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

現実のシナリオでは、一方のファイルには他方のファイルに対応する一致するレコードがない場合があります。まだ給与が割り当てられていない新しい社員を追加することでこれをシミュレートしましょう。

この社員を employees.txt に追加します。

echo "1006 Alex IT" >> employees.txt

>> 演算子は、既存のコンテンツを上書きすることなく、新しい行をファイルの末尾に追加します。

次に、基本的な結合コマンドを実行します。

join employees.txt salaries.txt

出力にAlexが表示されないことに気付くでしょう。なぜなら、salaries.txt に一致するレコードがないからです。

一致しないレコードを含めるには、-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 オプションは、join に最初のファイル(employees.txt)から一致しない行を含めるように指示します。これは、一方のファイルのすべてのレコードを表示したい場合に便利です。たとえ他方のファイルに一致するレコードがなくてもです。

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

これまで、最初のフィールド(社員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 は、最初のファイル(employees.txt)の3番目のフィールドを結合フィールドとして join に指示します。
  • -2 1 は、2番目のファイル(departments.txt)の1番目のフィールドを結合フィールドとして指示します。

これにより、最初のフィールドだけでなく、任意の共通フィールドを基にファイルを結合することができます。ファイルの構造が異なるが、いくつかの共通情報を共有している場合に特に役立ちます。

まとめ

この実験では、Linux で join コマンドを使って複数のファイルからのデータをマージする方法を学びました。join のいくつかの重要な機能を調べました。

  • 共通フィールドを基にした2つのファイルの基本的な結合
  • -o オプションを使った出力順序のカスタマイズ
  • -a オプションを使った一致しないレコードの含め方
  • -1-2 オプションを使った最初の列以外のフィールドでの結合

この実験では扱わなかった追加の join オプションには以下があります。

  • -t CHAR:CHAR を入力および出力フィールド区切り文字として使用する
  • -i:フィールドを比較する際に大文字小文字の違いを無視する
  • -e STRING:欠落した入力フィールドを STRING で置き換える
  • -j FIELD-1 FIELD -2 FIELD に相当する
  • -v FILE_NUMBER-a FILE_NUMBER と同じだが、結合された出力行を抑制する

join コマンドは Linux でのデータ処理において強力なツールで、複数のソースからの情報を効率的に結合することができます。Linux 環境でデータを扱い続ける際、join は異なるファイルからの情報をマージおよび分析するための貴重な資産であることを忘れないでください。

参考資料