テキスト列の値に基づいて大容量ファイルを複数の小さなファイルに分割する方法は?

テキスト列の値に基づいて大容量ファイルを複数の小さなファイルに分割する方法は?

大容量ファイルがあるため、利用可能な部分に分割する必要があります。 (レコード3億5000万個)重要なことは、2番目の列の値が次のファイルにオーバーフローできないことです。

読み書きに時間がかかりすぎて分割コマンドが機能しません。私ができることは他にありますか?

10個のレコードを含むサンプルファイルは3つの出力ファイルに分割されます。

aa,22,xxx
aa,22,xxx
aa,22,xxx
aa,22,xxx
aa,22,xxx
aa,23,xxx
aa,23,xxx
aa,23,xxx
aa,23,xxx
aa,24,xxx

出力1:

aa,22,xxx
aa,22,xxx
aa,22,xxx
aa,22,xxx
aa,22,xxx

出力2:

aa,23,xxx
aa,23,xxx
aa,23,xxx
aa,23,xxx

出力3:

aa,24,xxx

ベストアンサー1

そしてawk

awk -F, '$2 != ref { i++; ref = $2 } { print $0 >"output" i }' input

2番目の列inputに基づいてファイルに分割されますoutput1output2

出力ファイルごとの行数を制限するには、次のようにします。

awk -F, '$2 != ref { i++; ref = $2; lines = 0 } lines >= 1000 { i++; lines = 0 } { print $0 >"output" i; lines++ }' input

2番目の列の制約を考慮して、最大1000行を含む出力ファイルが生成されます。

以下は、指定された制限(この場合は1000行、50000000行を使用できます)に達した後に2番目の列の次の変更時に分割される別の変形です。

awk -F, 'BEGIN { change = 1 } change && $2 != ref { i++; ref = $2; change = 0; lines = 0 } lines >= 1000 { change = 1 } { print $0 >"output" i; lines++; ref = $2 }' input

おすすめ記事