\r\n\r\n

linuxでのjoinコマンドの使い方

2つのテキストファイルから共通のフィールドをマッチングしてデータを結合するには、linuxのjoinコマンドを使用します。静的データファイルに華やかさを添えます。その使い方を紹介する...

2つのテキストファイルから共通のフィールドをマッチングさせてデータを結合するには、Linuxのjoinコマンドを使用します。静的データファイルに華やかさを添えます。その使い方をご紹介します。

ファイル間のデータ照合

データは王様です。会社も企業も家庭も、すべてその上で動いているのです。しかし、データが異なるファイルに保存され、異なる人によって整理されていると、それは面倒なことです。どのファイルを開けば必要な情報が得られるかを知るだけでなく、ファイルのレイアウトや形式も様々です。

また、どのファイルを更新する必要があるか、どれをバックアップする必要があるか、どれがレガシーファイルでどれがアーカイブ可能か、といった管理上の課題にも対処しなければなりません。

さらに、データを統合したり、データセット全体で何らかの分析を行う必要がある場合、別の問題が発生します。異なるファイルからのデータを処理する前に、どのように合理化するのですか?データ準備の段階からどうするか?

もし、これらのファイルが少なくとも1つの共通のデータ要素を共有していれば、linuxjoinコマンドは問題を解決してくれる。

データファイル

joinコマンドの使い方を説明するために使用するデータはすべて架空のもので、次の2つのファイルから始めます。

cat file-1.txt cat file-2.txt

以下は、file-1.txtの内容である。

1 Adore Varian [email protected] Female 192.57.150.231 2 Nancee Merrell [email protected] Female 22.198.121.181 3 Herta Friett [email protected] Female 33.167.32.89 4 Torie Venmore [email protected] Female 251.9.204.115 5 Deni Sealeaf [email protected] Female 210.53.81.212 6 Fidel Bezley [email protected] Male 72.173.218.75 7 Ulrikaumeko Standen [email protected] Female 4.204.0.237 8 Odell Jursch [email protected] Male 1.138.85.117

番号のついた行の集合があり、それぞれの行には以下の情報がすべて含まれています。

  • 1件
  • 名称
  • 苗字
  • 電子メールアドレス
  • 対象者の性別
  • IPアドレス

以下は、file-2.txtの内容である。

1 Varian [email protected] Female Western New York $535,304.73 2 Merrell [email protected] Female Finger Lakes $309,033.10 3 Friett [email protected] Female Southern Tier $461,664.44 4 Venmore [email protected] Female Central New York $175,818.02 5 Sealeaf [email protected] Female North Country $126,690.15 6 Bezley [email protected] Male Mohawk Valley $366,733.78 7 Standen [email protected] Female Capital District $674,634.93 8 Jursch [email protected] Male Hudson Valley $663,821.09

file-2.txtの各行には、以下の情報が含まれています。

  • 1件
  • 苗字
  • 電子メールアドレス
  • 対象者の性別
  • ニューヨークのある地域
  • 1ドルの価値

joinコマンドは、「フィールド」と組み合わせて使用します。このドキュメントでは、スペースで囲まれたテキストのセクション、行頭、行末を意味します。joinが2つのファイル間の行を照合するためには、それぞれの行に共通のフィールドが含まれていなければなりません。

したがって、両方のファイルに表示されている場合のみ、そのフィールドをマッチングさせることができます。IPアドレスは1つのファイルにしか表示されないので、これはよくありません。ファーストネームは1つのファイルにしか出てこないので、これも使えない。苗字は両方のファイルにありますが、異なる人が同じ苗字を持つので、これは良くない選択です。

また、**や**の項目は曖昧なので、データをリンクさせることはできません。ニューヨークの地域やドルの値も、1つのファイルだけに表示されます。

しかし、電子メールアドレスは両方のファイルに存在し、それぞれのファイルがその人に固有であるため、使用することができます。また、ファイルをざっと見たところ、各ファイルの行は同一人物に対応していることが確認できたので、行番号を照合するフィールドとして使用することができます(後で別のフィールドを使用します)。

2つのファイルには異なる数のフィールドがあることに注意してください。

ただし、ニューヨーク地域のようなフィールドには注意が必要だ。スペースで区切られたファイルでは、地域名の各単語が1つのフィールドのように見える。地域によっては2語、3語の名称があるため、実際には同じファイル内に異なる数のフィールドが存在します。ニューヨーク地域の前の行に表示されるフィールドと一致すれば、可能です。

ジョインコマンド

まず、照合するフィールドをソートする必要があります。両方のファイルに昇順の数字があるので、この条件を満たしています。デフォルトでは、joinはファイルの最初のフィールドを使用しますが、これは私たちが望むものです。もう1つの妥当なデフォルトは、joinがフィールドセパレータをスペースと見なすことです。ここでも、持っているので、ジョインを発射することができます。

すべてデフォルトを使うので、コマンドはシンプルです。

join file-1.txt file-2.txt

は、コマンドラインに記載された順序に従って、ファイルを「ファイル1」と「ファイル2」として扱います。

出力は以下の通りです。

1 Adore Varian [email protected] Female 192.57.150.231 Varian [email protected] Female Western New York $535,304.73 2 Nancee Merrell [email protected] Female 22.198.121.181 Merrell [email protected] Female Finger Lakes $309,033.10 3 Herta Friett [email protected] Female 33.167.32.89 Friett [email protected] Female Southern Tier $461,664.44 4 Torie Venmore [email protected] Female 251.9.204.115 Venmore [email protected] Female Central New York $175,818.02 5 Deni Sealeaf [email protected] Female 210.53.81.212 Sealeaf [email protected] Female North Country $126,690.15 6 Fidel Bezley [email protected] Male 72.173.218.75 Bezley [email protected] Male Mohawk Valley $366,733.78 7 Ulrikaumeko Standen [email protected] Female 4.204.0.237 Standen [email protected] Female Capital District $674,634.93 8 Odell Jursch [email protected] Male 1.138.85.117 Jursch [email protected] Male Hudson Valley $663,821.09

出力の形式は、まず行が一致するフィールドを表示し、次にファイル1の他のフィールドを表示し、次にファイル2の一致するフィールドがないフィールドを表示するというものである。

ソートされていないフィールド

うまくいかないとわかっていることに挑戦してみよう。ファイル内の行を順番に並べることで、joinが**正確に**せずに処理するようにします。file-3.txtはfile-2.txtと同じ内容ですが、8行目が5行目と6行目の間に入っています。

以下は、file-3.txtの内容である。

1 Varian [email protected] Female Western New York $535,304.73 2 Merrell [email protected] Female Finger Lakes $309,033.10 3 Friett [email protected] Female Southern Tier $461,664.44 4 Venmore [email protected] Female Central New York $175,818.02 5 Sealeaf [email protected] Female North Country $126,690.15 8 Jursch [email protected] Male Hudson Valley $663,821.09 6 Bezley [email protected] Male Mohawk Valley $366,733.78 7 Standen [email protected] Female Capital District $674,634.93

以下のコマンドを入力して、file-3.txtをfile-1.txtにリンクさせようとします。

join file-1.txt file-3.txt

ジョインレポート file-3.txt の7行目に不具合があるため、処理されない。7行目は6という数字で始まっていますが、これは正しくソートされたリストでは8の前に来るはずです。ファイルの6行目("8 Odell "で始まる)は、最後に処理される行なので、その出力を見ることができます。

結合がファイルのソート順と一致しているかどうかを確認したい場合は、マージを試みずに --check order オプションを使用することができます。

そのために、次のように入力します。

join --check-order file-1.txt file-3.txt

は、file-3.txtファイルの7行目に問題があることを事前に教えてくれます。

行が足りないドキュメント

file-4.txtでは、最後の行が削除されているため、8行目がありません。

1 Varian [email protected] Female Western New York $535,304.73 2 Merrell [email protected] Female Finger Lakes $309,033.10 3 Friett [email protected] Female Southern Tier $461,664.44 4 Venmore [email protected] Female Central New York $175,818.02 5 Sealeaf [email protected] Female North Country $126,690.15 6 Bezley [email protected] Male Mohawk Valley $366,733.78 7 Standen [email protected] Female Capital District $674,634.93

次のように入力すると、意外にもjoinは文句を言わず、できる限りの行を処理します。

join file-1.txt file-4.txt

出力には、マージされた7つの行が表示されます。

a (print unpairable) オプションは、pairable でない行も印刷するようjoinに指示します。

ここでは、以下のコマンドを入力して、ファイル1の行のうちファイル2の行と一致しないものを印刷するようにjoinに指示します。

join -a 1 file-1.txt file-4.txt

7行が一致し、ファイル1の8行目が印刷され、一致しない。file-4.txt にはマッチング可能な 8 行目が含まれていないため、マージ情報はありません。しかし、少なくとも出力にはまだ表示されているので、file-4.txtにマッチするものがないことがわかる。

以下の-v (suppress linkage)コマンドを入力し、一致しない行を表示させる。

join -v file-1.txt file-4.txt

ファイル2において、8行目だけが一致しないことがわかります。

他のフィールドと一致する

デフォルトでないフィールド(フィールド1)上で2つの新しいファイルをマッチングしてみましょう。file-7.txtの内容は次のとおりです。

[email protected] Female 192.57.150.231 [email protected] Female 210.53.81.212 [email protected] Male 72.173.218.75 [email protected] Female 33.167.32.89 [email protected] Female 22.198.121.181 [email protected] Male 1.138.85.117 [email protected] Female 251.9.204.115 [email protected] Female 4.204.0.237

file-8.txtの内容は以下の通りです。

Female [email protected] Western New York $535,304.73 Female [email protected] North Country $126,690.15 Male [email protected] Mohawk Valley $366,733.78 Female [email protected] Southern Tier $461,664.44 Female [email protected] Finger Lakes $309,033.10 Male [email protected] Hudson Valley $663,821.09 Female [email protected] Central New York $175,818.02 Female [email protected] Capital District $674,634.93

結合に使用する唯一の賢明なフィールドは電子メールアドレスで、これは最初のファイルのフィールド1と2番目のファイルのフィールド2です。これに対応するために、-1(ファイル1のフィールド)と-2(ファイル2のフィールド)オプションを使用できます。各ファイルのどのフィールドを接続に使用するかを数字で示すことにします。

次のコマンドを入力して、joinにファイル1の1番目のフィールドとファイル2の2番目のフィールドを使用するように指示します。

join -1 1 -2 2 file-7.txt file-8.txt

ファイルは、出力の各行の最初のフィールドとして表示される電子メールアドレスにマージされます。

異なるフィールドセパレータを使用する

ファイル内のフィールドがスペースで区切られていない場合はどうなりますか?

次の2つの文書は、カンマで区切り、複数の単語を持つ地名の間はスペースだけにしています。

cat file-5.txt cat file-6.txt

フィールドの区切り文字としてどの文字を使うかは、-t (separator)を使ってjoinに指示することができます。この場合はカンマなので、次のようなコマンドを入力します。

join -t, file-5.txt file-6.txt

全行を一致させ、地名にはスペースを残しています。

大文字小文字を区別しない

もう一つのファイル、file-9.txtは、file-8.txtとほぼ同じ内容です。ただ、以下のように、一部のメールアドレスが大文字になっている点が異なります。

Female [email protected] Western New York $535,304.73 Female [email protected] North Country $126,690.15 Male [email protected] Mohawk Valley $366,733.78 Female [email protected] Southern Tier $461,664.44 Female [email protected] Finger Lakes $309,033.10 Male [email protected] Hudson Valley $663,821.09 Female [email protected] Central New York $175,818.02 Female [email protected] Capital District $674,634.93

file-7.txtとfile-8.txtを追加すると、非常によく動作します。file-7.txtとfile-9.txtがどうなるかを見てみましょう。

次のようなコマンドを入力します。

join -1 1 -2 2 file-7.txt file-9.txt

6行しかマッチングしなかった。大文字と小文字の違いで、他の2つのメールアドレスが繋がらなかったのだ。

しかし、-i(大文字小文字を無視)オプションを使用すると、joinはこれらの違いを無視し、大文字小文字に関係なく同じテキストを含むフィールドにマッチするように強制することができます。

次のようなコマンドを入力します。

join -1 1 -2 2 -i file-7.txt file-9.txt

8回線すべてがマッチングし、正常に接続されました。

ミックス&マッチ

joinでは、トリッキーなデータ作成に対応するための強力な味方を手に入れることができます。おそらく、データを分析する必要があったり、他のシステムへのインポートを実行するためにデータを形状に変換しようとしているのでしょう。

どんな状況でも、喜んで参加しますよ。

あなたが興味を持っているかもしれない記事

匿名者
匿名者

0 件の投稿

作家リスト

  1. admin 0 投稿
  2. 匿名者 0 投稿

おすすめ