2017-05-04 1 views
-1

同様の質問hereを慎重に引用していますが、列1に異なる値があるので、第1列の値に基づいて行数が設定されたファイルに大きなファイルを分割します

A.B|100|20 
A.B|101|20 
A.X|101|30 
A.X|1000|20 
B.Y|1|1 
B.Y|1|2 

私はそれをxファイルに分割して、各ファイルに最大5行を含むようにしたいと考えています。例では、私は2つのファイルたい:

A.B|100|20 
A.B|101|20 
A.X|101|30 
A.X|1000|20 

B.Y|1|1 
B.Y|1|2 

のawk -Fを\ | '{print> $ 1}' file1

この例では、2段階で簡単に目標に到達できました。私の実際のファイルでは、最初の列に約200Gigの大きなファイルを1千万の一意の値で分割したいと考えています。私は各ファイルに約1,000,000行(つまり柔軟な閾値)を持たせたいと思います。私は数百万のファイルを生成する余裕がないので、2ステップで作成することは実現不可能です。何か案が?ダブルで

+0

まあ、1000万のユニークな "キー"と最大5行のファイルでは、少なくとも200万ファイル。たぶん、何をする必要があるのか​​私たちを老後にしたら、どうやってやるべきかを助けるかもしれません。 –

+0

あなたは、最大5行*を含む*ファイルを書きましたが、frst出力には4行が含まれているかどうかは不明です。そうすれば、何百万ものファイルを生成する余裕はありませんが、大きなファイルを同時に分割したいと考えています。矛盾する音 – RomanPerekhrest

+0

混乱して申し訳ありません。私は再び私の質問を編集しました。 – Sara

答えて

1

あなたはしかし、ユニークな鍵の一つは、目的のファイルの長さよりも多くのレコードを持つことができる場合、非分割および最大ファイル長を維持するが競合すること

$ awk -F\| -v size=5 'NR==FNR {a[$1]++; next} 
       FNR==1 || p!=$1 {if(count+a[$1]>=size) {f++; count=0} 
           else count+=a[$1]; p=$1} 
           {print > "_file_"f+0}' file{,} 

$ head _f* 
==> _file_0 <== 
A.B|100|20 
A.B|101|20 
A.X|101|30 
A.X|1000|20 

==> _file_1 <== 
B.Y|1|1 
B.Y|1|2 

ノートを行うことができ、ファイルをスキャンします。このスクリプトでは、非分割がより重要であると仮定しました。たとえば、同じ入力ファイルの変更では、size = 1を設定します。キーは別々のファイルに分割されませんが、ファイルの長さは1より大きくなります。

+0

うまく動作します、ありがとう! – Sara

+0

idkの質問は明らかではないので、200ギガバイトのファイルを2回読み込み、1000万の値をメモリに保存するよりも良い解決法があるかもしれません。 btw出力リダイレクションの右側の括弧で囲まれていない式の使用は、POSIXごとの未定義の動作ですので、代わりに 'print>(" _file_ "f + 0)'に微調整しないとYMMVです。また、GNU awkを使用していない場合は、出力ファイルを閉じるロジックを追加して、オープンファイルが多すぎるのを避ける必要があります。 –

関連する問題