\r\n\r\n
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番号のついた行の集合があり、それぞれの行には以下の情報がすべて含まれています。
以下は、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.09file-2.txtの各行には、以下の情報が含まれています。
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.txt7行が一致し、ファイル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.237file-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.93file-7.txtとfile-8.txtを追加すると、非常によく動作します。file-7.txtとfile-9.txtがどうなるかを見てみましょう。
次のようなコマンドを入力します。
join -1 1 -2 2 file-7.txt file-9.txt6行しかマッチングしなかった。大文字と小文字の違いで、他の2つのメールアドレスが繋がらなかったのだ。
しかし、-i(大文字小文字を無視)オプションを使用すると、joinはこれらの違いを無視し、大文字小文字に関係なく同じテキストを含むフィールドにマッチするように強制することができます。
次のようなコマンドを入力します。
join -1 1 -2 2 -i file-7.txt file-9.txt8回線すべてがマッチングし、正常に接続されました。
joinでは、トリッキーなデータ作成に対応するための強力な味方を手に入れることができます。おそらく、データを分析する必要があったり、他のシステムへのインポートを実行するためにデータを形状に変換しようとしているのでしょう。
どんな状況でも、喜んで参加しますよ。