技術ノート Linux Linux で join コマンドを使用する方法

Linux で join コマンドを使用する方法

共通フィールドを照合して 2 つのテキスト ファイルのデータを結合する場合は、Linux の join コマンドを使用できます。静的データ ファイルにダイナミズムを加えます。使い方をご紹介します。

ファイル間でのデータの一致

データは王様です。企業、企業、家庭も同様にそれに基づいて運営されています。しかし、データを別のファイルに保存し、別の人が照合するのは面倒です。必要な情報を見つけるためにどのファイルを開けばよいかが分かるだけでなく、ファイルのレイアウトや形式も異なる可能性があります。

また、どのファイルを更新する必要があるのか​​、どのファイルをバックアップする必要があるのか​​、どのファイルがレガシーなのか、どのファイルをアーカイブできるのかといった管理上の悩みにも対処する必要があります。

さらに、データを統合したり、データセット全体にわたって何らかの分析を実行したりする必要がある場合には、さらなる問題が発生します。必要な処理を実行する前に、さまざまなファイルにまたがるデータをどのように合理化すればよいでしょうか?データ準備フェーズにはどのようにアプローチしますか?

幸いなことに、ファイルが少なくとも 1 つの共通データ要素を共有している場合、Linux の join コマンドを使用すると泥沼から抜け出すことができます。

Linux で join コマンドを使用する方法

データファイル

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

猫ファイル-1.txt

猫ファイル-2.txt

file-1.txt の内容は次のとおりです。

 1 アドア バリアン avarian0@newyorker.com 女性 192.57.1​​50.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 語の名前が付いているため、実際には同じファイル内に異なる数のフィールドがあります。ニューヨーク地域の前の行に表示されるフィールドに一致する限り、これは問題ありません。

Linux で join コマンドを使用する方法

結合コマンド

まず、照合するフィールドを並べ替える必要があります。両方のファイルに昇順の番号が含まれているため、その基準を満たしています。デフォルトでは、 join ファイル内の最初のフィールドを使用します。これは私たちが望むものです。もう 1 つの賢明なデフォルトは、 join フィールド区切り文字が空白であることを想定することです。繰り返しますが、これを取得したので、先に進んで join 起動できます。

すべてデフォルトを使用しているため、コマンドは簡単です。

結合 ファイル-1.txt ファイル-2.txt

join コマンド ラインにリストされている順序に従って、ファイルを「ファイル 1」および「ファイル 2」とみなします。

出力は次のとおりです。

 1 Adore Varian avarian0@newyorker.com 女性 192.57.1​​50.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 のフィールドが一致フィールドなしで出力されます。

Linux で join コマンドを使用する方法

未ソートのフィールド

うまくいかないとわかっていることを試してみましょう。 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 行目に問題があることを事前に通知します。

Linux で join コマンドを使用する方法

行が欠落しているファイル

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 行目だけであることがわかります。

Linux で join コマンドを使用する方法

他のフィールドとのマッチング

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

 avarian0@newyorker.com 女性 192.57.1​​50.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

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

Linux で join コマンドを使用する方法

異なるフィールド区切り文字の使用

空白以外のフィールドで区切られたファイルがある場合はどうすればよいでしょうか?

次の 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コマンド

ファイル

tar pv cat tac chmod grep diff sed ar man pushd popd fsck testdisk seq fd pandoc cd $PATH awk join jq fold uniq journalctl · tail · stat · ls · fstab · echo · less · chgrp · chown · rev · look · strings · type · rename · zip · unzip · mount · umount · install · fdisk · mkfs · rm · rmdir · rsync · df · gpg · vi · · mkdir · du · ln · パッチ · 変換 · rclone · シュレッド · srm · scp · gzip · chattr · カット · 検索 · umask · wc · tr

プロセス

エイリアス · スクリーン · トップ · ナイス · renice · 進行状況 · strace · systemd · tmux · chsh · 履歴 · at · バッチ · フリー · what · dmesg · chfn · usermod · ps · chroot · xargs · tty · pinky · lsof · vmstat · タイムアウト · ウォール · はい · キル · スリープ · sudo · su · タイム · groupadd · usermod · · lshw · シャットダウン · 再起動 · 停止 · パワーオフ · パスワード · lscpu · crontab · 日付 · bg · fg · pidof · nohup · pmap

ネットワーキング

netstat ping ip ss whois fail2ban bmon dig finger nmap ftp curl wget who whoami w iptables ssh-keygen ufw arping firewalld

関連: 開発者と愛好家のための最高の Linux ラップトップ

「Linux で join コマンドを使用する方法」に関するベスト動画選定!

Unix/Linuxコマンドラインの使い方
LPIC-2 深掘りシリーズ第二弾:新しいネットワーク系コマンドを理解する 2021-1-30 C-3