共通フィールドを照合して 2 つのテキスト ファイルのデータを結合する場合は、Linux の
join
コマンドを使用できます。静的データ ファイルにダイナミズムを加えます。使い方をご紹介します。
ファイル間でのデータの一致
データは王様です。企業、企業、家庭も同様にそれに基づいて運営されています。しかし、データを別のファイルに保存し、別の人が照合するのは面倒です。必要な情報を見つけるためにどのファイルを開けばよいかが分かるだけでなく、ファイルのレイアウトや形式も異なる可能性があります。
また、どのファイルを更新する必要があるのか、どのファイルをバックアップする必要があるのか、どのファイルがレガシーなのか、どのファイルをアーカイブできるのかといった管理上の悩みにも対処する必要があります。
さらに、データを統合したり、データセット全体にわたって何らかの分析を実行したりする必要がある場合には、さらなる問題が発生します。必要な処理を実行する前に、さまざまなファイルにまたがるデータをどのように合理化すればよいでしょうか?データ準備フェーズにはどのようにアプローチしますか?
幸いなことに、ファイルが少なくとも 1 つの共通データ要素を共有している場合、Linux の
join
コマンドを使用すると泥沼から抜け出すことができます。
データファイル
join
コマンドの使用法を示すために使用するデータはすべて架空のもので、次の 2 つのファイルから始まります。
猫ファイル-1.txt
猫ファイル-2.txt
file-1.txt
の内容は次のとおりです。
1 アドア バリアン avarian0@newyorker.com 女性 192.57.150.231
2 ナンシー・メレル nmerrell1@ted.com 女性 22.198.121.181
3 ヘルタ フリーエット hfriett2@dagondesign.com 女性 33.167.32.89
4 トリー・ヴェンモア tvenmore3@gmpg.org 女性 251.9.204.115
5 デニ・シーリーフ dsealeaf4@nps.gov 女性 210.53.81.212
6 フィデル・ベズリー fbezley5@lulu.com 男性 72.173.218.75
7 ウルリカウメコ スタンデン ustanden6@geocities.jp 女性 4.204.0.237
8 オデル・ジュルシュ ojursch7@utexas.edu 男性 1.138.85.117
番号付きの一連の行があり、各行には次のすべての情報が含まれています。
- 数
- 名前
- 姓
- メールアドレス
- その人の性別
- IPアドレス
file-2.txt
の内容は次のとおりです。
1 バリアン avarian0@newyorker.com 女性 ニューヨーク州西部 $535,304.73
2 メレル nmerrell1@ted.com メス フィンガー レイク $309,033.10
3 Friett hfriett2@dagondesign.com 女性南部層 $461,664.44
4 Venmore tvenmore3@gmpg.org 女性 セントラル ニューヨーク $175,818.02
5 Sealeaf dsealeaf4@nps.gov 北国の女性 $126,690.15
6 Bezley fbezley5@lulu.com 男性モホークバレー $366,733.78
7 スタンデン ustanden6@geocities.jp 女性首都地区 $674,634.93
8 Jursch ojursch7@utexas.edu 男性 ハドソンバレー $663,821.09
file-2.txt
の各行には次の情報が含まれます。
- 数
- 姓
- メールアドレス
- その人の性別
- ニューヨークの一地域
- ドルの価値
join
コマンドは「フィールド」で機能します。この文脈では、空白で囲まれたテキストのセクション、行の先頭、または行の末尾を意味します。
join
させるには、各行に共通のフィールドが含まれている必要があります。
したがって、フィールドが両方のファイルに存在する場合にのみ、フィールドを照合できます。 IP アドレスは 1 つのファイルにしか表示されないので、これではダメです。名前は 1 つのファイルにのみ表示されるため、これも使用できません。姓は両方のファイルにありますが、異なる人が同じ姓を持っているため、これは不適切な選択です。
また、データが曖昧すぎるため、男性と女性のエントリを結び付けることもできません。ニューヨークの地域とドルの値も 1 つのファイルにのみ表示されます。
ただし、電子メール アドレスは両方のファイルに存在し、それぞれが個人に固有であるため、使用できます。ファイルをざっと見てみると、それぞれの行が同じ人物に対応していることも確認できるため、照合するフィールドとして行番号を使用できます (後で別のフィールドを使用します)。
2 つのファイルにはフィールドの数が異なることに注意してください。これは問題ありません。各ファイルからどのフィールドを使用するかを
join
判断できます。
ただし、ニューヨーク地域のようなフィールドには注意してください。スペースで区切られたファイルでは、領域名の各単語がフィールドのように見えます。一部の地域には 2 語または 3 語の名前が付いているため、実際には同じファイル内に異なる数のフィールドがあります。ニューヨーク地域の前の行に表示されるフィールドに一致する限り、これは問題ありません。
結合コマンド
まず、照合するフィールドを並べ替える必要があります。両方のファイルに昇順の番号が含まれているため、その基準を満たしています。デフォルトでは、
join
ファイル内の最初のフィールドを使用します。これは私たちが望むものです。もう 1 つの賢明なデフォルトは、
join
フィールド区切り文字が空白であることを想定することです。繰り返しますが、これを取得したので、先に進んで
join
起動できます。
すべてデフォルトを使用しているため、コマンドは簡単です。
結合 ファイル-1.txt ファイル-2.txt
join
コマンド ラインにリストされている順序に従って、ファイルを「ファイル 1」および「ファイル 2」とみなします。
出力は次のとおりです。
1 Adore Varian avarian0@newyorker.com 女性 192.57.150.231 Varian avarian0@newyorker.com 女性 ニューヨーク州西部 $535,304.73
2 ナンシー・メレル nmerrell1@ted.com 女性 22.198.121.181 メレル nmerrell1@ted.com 女性 フィンガー・レイクス $309,033.10
3 Herta Friett hfriett2@dagondesign.com 女性 33.167.32.89 Friett hfriett2@dagondesign.com 女性 南層 $461,664.44
4 トリー・ヴェンモア tvenmore3@gmpg.org 女性 251.9.204.115 ヴェンモア tvenmore3@gmpg.org 女性 ニューヨーク州中部 $175,818.02
5 デニ Sealeaf dsealeaf4@nps.gov 女性 210.53.81.212 Sealeaf dsealeaf4@nps.gov 女性 北国 $126,690.15
6 フィデル・ベズリー fbezley5@lulu.com 男性 72.173.218.75 ベズリー fbezley5@lulu.com 男性 モホーク・バレー $366,733.78
7 ウルリカウメコ スタンデン ustanden6@geocities.jp 女性 4.204.0.237 スタンデン ustanden6@geocities.jp 女性首都地区 $674,634.93
8 オデル・ジャーシュ ojursch7@utexas.edu 男性 1.138.85.117 ジャーシュ ojursch7@utexas.edu 男性 ハドソンバレー $663,821.09
出力は次のようにフォーマットされます。行が一致したフィールドが最初に出力され、次にファイル 1 の他のフィールドが出力され、次にファイル 2 のフィールドが一致フィールドなしで出力されます。
未ソートのフィールド
うまくいかないとわかっていることを試してみましょう。 1 つのファイル内の行を順序を変えて配置するため、
join
ファイルを正しく処理できません。
file-3.txt
の内容は
file-2.txt
と同じですが、8 行目は 5 行目と 6 行目の間にあります。
file-3.txt
の内容は次のとおりです。
1 バリアン avarian0@newyorker.com 女性 ニューヨーク州西部 $535,304.73
2 メレル nmerrell1@ted.com メス フィンガー レイク $309,033.10
3 Friett hfriett2@dagondesign.com 女性南部層 $461,664.44
4 Venmore tvenmore3@gmpg.org 女性 セントラル ニューヨーク $175,818.02
5 Sealeaf dsealeaf4@nps.gov 北国の女性 $126,690.15
8 Jursch ojursch7@utexas.edu 男性 ハドソンバレー $663,821.09
6 Bezley fbezley5@lulu.com 男性モホークバレー $366,733.78
7 スタンデン ustanden6@geocities.jp 女性首都地区 $674,634.93
次のコマンドを入力して、
file-3.txt
を
file-1.txt
に結合します。
結合 ファイル-1.txt ファイル-3.txt
join
、
file-3.txt
の 7 行目が間違っているため、処理されないことを報告します。 7 行目は数字の 6 で始まる行で、正しくソートされたリストでは 8 の前に来るはずです。ファイルの 6 行目 (「8 Odell」で始まる) は最後に処理された行なので、その出力が表示されます。
join
ファイルのソート順に適合しているかどうかを確認したい場合は、
--check-order
オプションを使用できます。マージは試行されません。
これを行うには、次のように入力します。
join --check-order file-1.txt file-3.txt
join
ファイル
file-3.txt
の 7 行目に問題があることを事前に通知します。
行が欠落しているファイル
file-4.txt
では、最後の行が削除されているため、8 行目はありません。内容は以下の通りです。
1 バリアン avarian0@newyorker.com 女性 ニューヨーク州西部 $535,304.73
2 メレル nmerrell1@ted.com メス フィンガー レイク $309,033.10
3 Friett hfriett2@dagondesign.com 女性南部層 $461,664.44
4 Venmore tvenmore3@gmpg.org 女性 セントラル ニューヨーク $175,818.02
5 Sealeaf dsealeaf4@nps.gov 北国の女性 $126,690.15
6 Bezley fbezley5@lulu.com 男性モホークバレー $366,733.78
7 スタンデン ustanden6@geocities.jp 女性首都地区 $674,634.93
次のように入力すると、驚くべきことに、
join
文句を言わず、処理できるすべての行を処理します。
結合ファイル-1.txt ファイル-4.txt
出力には、マージされた 7 行がリストされます。
-a
(ペア不可の出力) オプションは、一致しなかった行も出力するように
join
指示します。
ここで、次のコマンドを入力して、ファイル 2 の行と一致しないファイル 1 の行を印刷するように
join
指示します。
join -a 1 ファイル-1.txt ファイル-4.txt
7 行が一致し、ファイル 1 の 8 行が一致せずに出力されます。
file-4.txt
には一致する可能性のある 8 行目が含まれていなかったため、マージされた情報はありません。ただし、少なくとも出力にはまだ表示されるため、
file-4.txt
内に一致がないことがわかります。
次の
-v
(結合行を抑制) コマンドを入力して、一致しない行を表示します。
join -v ファイル-1.txt ファイル-4.txt
ファイル 2 で一致しないのは 8 行目だけであることがわかります。
他のフィールドとのマッチング
デフォルトではないフィールド (フィールド 1) で 2 つの新しいファイルを照合してみましょう。 file-7.txt の内容は次のとおりです。
avarian0@newyorker.com 女性 192.57.150.231
dsealeaf4@nps.gov 女性 210.53.81.212
fbezley5@lulu.com 男性 72.173.218.75
hfriett2@dagondesign.com 女性 33.167.32.89
nmerrell1@ted.com 女性 22.198.121.181
ojursch7@utexas.edu 男性 1.138.85.117
tvenmore3@gmpg.org 女性 251.9.204.115
ustanden6@geocities.jp 女性 4.204.0.237
file-8.txt の内容は次のとおりです。
女性 avarian0@newyorker.com ニューヨーク州西部 $535,304.73
女性 dsealeaf4@nps.gov 北国 $126,690.15
男性 fbezley5@lulu.com モホークバレー $366,733.78
女性 hfriett2@dagondesign.com 南層 $461,664.44
女性 nmerrell1@ted.com フィンガー・レイク $309,033.10
男性 ojursch7@utexas.edu ハドソンバレー $663,821.09
女性 tvenmore3@gmpg.org ニューヨーク中心部 $175,818.02
女性 ustanden6@geocities.jp 首都圏 $674,634.93
結合に使用できる唯一のフィールドは電子メール アドレスです。これは、最初のファイルのフィールド 1 と 2 番目のファイルのフィールド 2 です。これに対応するには、
-1
(ファイル 1 フィールド) オプションと
-2
(ファイル 2 フィールド) オプションを使用できます。これらの後に、各ファイルのどのフィールドを結合に使用するかを示す番号を付けます。
次のように入力して、
join
ファイル 1 の最初のフィールドとファイル 2 の 2 番目のフィールドを使用するように指示します。
結合 -1 1 -2 2 ファイル-7.txt ファイル-8.txt
ファイルは電子メール アドレスで結合され、出力の各行の最初のフィールドとして表示されます。
異なるフィールド区切り文字の使用
空白以外のフィールドで区切られたファイルがある場合はどうすればよいでしょうか?
次の 2 つのファイルはカンマで区切られています。複数の単語で構成される地名の間にあるのは空白のみです。
猫ファイル-5.txt
猫ファイル-6.txt
-t
(区切り文字) を使用して、フィールド区切り文字としてどの文字を使用するかを
join
に指示できます。この場合はカンマなので、次のコマンドを入力します。
結合 -t、ファイル-5.txt ファイル-6.txt
すべての行が一致し、場所名のスペースは保持されます。
大文字と小文字を無視する
別のファイル
file-9.txt
は、
file-8.txt
とほぼ同じです。唯一の違いは、以下に示すように、一部の電子メール アドレスが大文字であることです。
女性 avarian0@newyorker.com ニューヨーク州西部 $535,304.73
女性 dsealeaf4@nps.gov 北国 $126,690.15
男性 Fbezley5@lulu.com モホークバレー $366,733.78
女性 hfriett2@dagondesign.com 南層 $461,664.44
女性 nmerrell1@ted.com フィンガー・レイク $309,033.10
男性 Ojursch7@utexas.edu ハドソンバレー $663,821.09
女性 tvenmore3@gmpg.org ニューヨーク中心部 $175,818.02
女性 ustanden6@geocities.jp 首都圏 $674,634.93
file-7.txt
と
file-8.txt
を結合すると、完全に機能しました。
file-7.txt
と
file-9.txt
で何が起こるかを見てみましょう。
次のコマンドを入力します。
結合 -1 1 -2 2 ファイル-7.txt ファイル-9.txt
一致したのは 6 行だけでした。大文字と小文字の違いにより、他の 2 つの電子メール アドレスを結合できませんでした。
ただし、
-i
(大文字と小文字を区別しない) オプションを使用すると、結合でこれらの違いを無視し、大文字と小文字に関係なく同じテキストを含むフィールドと
join
できます。
次のコマンドを入力します。
join -1 1 -2 2 -i file-7.txt file-9.txt
8 行すべてが一致し、正常に結合されました。
ミックスアンドマッチ
join
には、厄介なデータの準備に取り組んでいるときの強力な味方がいます。おそらく、データを分析する必要があるか、別のシステムへのインポートを実行するためにデータを加工しようとしているかもしれません。
どのような状況であっても、自分のコーナーに
join
できてうれしいです。
関連: 開発者と愛好家のための最高の Linux ラップトップ





