はじめに
この実験では、Linux の join
コマンドを使って複数のファイルからのデータを結合する方法を学びます。企業の人事部署で作業しており、異なるデータベースからの社員情報を結合する必要があるシナリオをシミュレートします。この実践的な演習は、データ処理タスクに対する join
コマンドの威力と柔軟性を示します。
💡 このチュートリアルは英語版からAIによって翻訳されています。原文を確認するには、 ここをクリックしてください
この実験では、Linux の join
コマンドを使って複数のファイルからのデータを結合する方法を学びます。企業の人事部署で作業しており、異なるデータベースからの社員情報を結合する必要があるシナリオをシミュレートします。この実践的な演習は、データ処理タスクに対する join
コマンドの威力と柔軟性を示します。
まず、社員データファイルの内容を調べましょう。employees.txt
と salaries.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
何が起こったか解説しましょう。
join
コマンドは両方のファイルの最初のフィールド(社員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
のいくつかの重要な機能を調べました。
-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
は異なるファイルからの情報をマージおよび分析するための貴重な資産であることを忘れないでください。