大容量ファイルがあるため、利用可能な部分に分割する必要があります。 (レコード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
に基づいてファイルに分割されますoutput1
。output2
出力ファイルごとの行数を制限するには、次のようにします。
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
答え2
使用ミラー:
$ mlr --nidx --fs comma put -q 'tee > $2 . ".dat", $*' ten.dat
$ cat 22.dat
aa,22,xxx
aa,22,xxx
aa,22,xxx
aa,22,xxx
aa,22,xxx
$ cat 23.dat
aa,23,xxx
aa,23,xxx
aa,23,xxx
aa,23,xxx
$ cat 24.dat
aa,24,xxx