join と split は異なるファイル処理を行います。join は並べ替え済みの 2 つのテキスト入力から関連レコードを結合し、split は 1 つの入力を連続した小ファイルへ分割します。
テキスト操作 · レッスン 11
結合と分割
並べ替え済みの 2 つのテキストファイルをキーで結合し、1 つのファイルを名前付きの断片へ分割する方法を学びます。
先頭フィールドで 2 ファイルを結合する
join は標準で、ちょうど 2 つの入力ファイルにある先頭の空白区切りフィールドを比較します。次のファイルは並べ替え済みです。
people.txt:
1 John
2 Jane
3 Mary
surnames.txt:
1 Doe
2 Doe
3 Sue
キーが等しいレコードを結合します。
$ join people.txt surnames.txt
1 John Doe
2 Jane Doe
3 Mary Sue
出力には共有キーが 1 回、その後に第 1、第 2 ファイルの残りのフィールドが入ります。join が一度に処理するのは 2 ファイルで、3 つの通常ファイルを 3 方向の関係結合としては受け取りません。
フィールドオプションなしの join first.txt second.txt はどのレコードを結合しますか?
結合キーを並べ替える
各入力は、互換性のある比較規則で結合フィールド順に並べる必要があります。標準のフィールド 1 なら、sort -k 1,1 でコピーを用意します。
$ LC_ALL=C sort -k 1,1 people-raw.txt > people.txt
$ LC_ALL=C sort -k 1,1 surnames-raw.txt > surnames.txt
$ LC_ALL=C join people.txt surnames.txt
並べ替えと結合で同じロケールを使えば照合規則が一致します。シェルが先にファイルを切り詰めるため、並べ替え結果を同じ入力パスへリダイレクトしないでください。
join が確実に一致を処理するため、通常どの準備が必要ですか?
異なる結合フィールドを選ぶ
第 1 ファイルのキーには -1 FIELD、第 2 ファイルには -2 FIELD を使います。第 1 入力に次が含まれるとします。
John 1
Jane 2
Mary 3
第 2 入力には次が含まれます。
1 Doe
2 Doe
3 Sue
第 1 入力をフィールド 2、第 2 入力をフィールド 1 で並べた後、次を実行できます。
$ join -1 2 -2 1 people.txt surnames.txt
1 John Doe
2 Jane Doe
3 Mary Sue
コロンなど 1 文字の非空白区切りには -t CHARACTER を使います。-a 1 や -a 2 は片方にしかない行を含められますが、標準では一致したキーだけを出力します。
第 1 ファイルのフィールド 2 と第 2 ファイルのフィールド 1 を結合するオプションはどれですか?
行数で分割する
split は 1 つの入力の連続部分を別々の出力ファイルへ書きます。キー結合を行う join の逆操作ではありません。
$ split large.txt
GNU の標準動作では 1 ファイルにつき最大 1000 行、接頭辞 x を使い、xaa、xab、xac などを作ります。行数は -l NUMBER、出力接頭辞は最後のオペランドで指定します。
$ split -l 500 large.txt part-
large.txt を最大 500 行ずつ、接頭辞 part- の断片へ分割するコマンドはどれですか?
サイズで分割する
-b SIZE は入力をバイトサイズで分割します。GNU の K、M、G などはここでは 1024 の累乗です。
$ split -b 10M archive.bin chunk-
最後の断片だけ小さくなる可能性があります。split はアーカイブの目録や再構築用メタデータを作らないため、接尾辞の順序を保ち、必要なら順番に連結してください。
archive.bin を接頭辞 chunk-、10 MiB ずつに分割するコマンドはどれですか?
キー結合と構造化データ処理を練習するには、次のラボを試してください。
- Linux join コマンド:ファイル結合 - 共通フィールドに基づき、並べ替え済み 2 ファイルの行を結合します。
- 従業員データの処理 -
joinやawkで複数ソースのデータを結合、処理します。
レッスン完了
結合と分割 を完了しました
並べ替え済みレコードを結合し、1 つの入力を順序付きの断片へ分割できるようになりました。
等しいキーフィールドでちょうど 2 ファイルを結合する。
両入力を結合キーで一貫して並べ替える。
-1と-2で標準以外のキーフィールドを選ぶ。-lで行数ごとに分割する。-bと明確な接頭辞でバイトサイズごとに分割する。