私は巨大なファイル(200万以上のレコード)を持っています。これは私の要件です。
- まず、大きなファイルを10個の小さなファイルに分割します。
- ファイルの種類は次のとおりです。
<File_name>
-<timestamp>
-xx
<timestamp>
各ファイルの同じ時間xx
1から10までのファイルを示します。
- 文書内の項目間には明確な区切りが必要です。つまり、同じ項目を複数のファイルに含めることはできません。
たとえば、次のようなファイルがあるとします。
ITEM,PARENT_PARTNUMBER,STORE_NUMBER,QUANTITY,BUYABLE,AVAILABILITYCODE,STORENAME,PHONENUMBER
400000209333,400000209333P,ALL,1297,1,2,,
400000209333,400000209333P,A-80007838,1297,1,2,,
400009664058,400009664058P,ALL,499,1,1,,
400009664058,400009664058P,A-80007838,477,1,1,,
400009664058,400009664058P,13806529,104,0,0,WDW - FLOWER & GARDEN,8-224-6122/5866
400000276151,400000276151P,ALL,0,0,0,,
400000276151,400000276151P,A-80007823,0,0,0,,
400000209692,400000209692P,ALL,8,1,1,,
その後、ファイルを次のように分割したいと思います。最初のファイル(最初のファイルが20000制限に達し、19999年にプロジェクト番号の変更があると仮定すると、最大ファイル制限は20000であるため、同じファイルにすることはできません。ファイル内で一意のプロジェクト番号を維持する必要があります。
400000209333,400000209333P,ALL,1297,1,2,,
400000209333,400000209333P,A-80007838,1297,1,2,,
400009664058,400009664058P,ALL,499,1,1,,
400009664058,400009664058P,A-80007838,477,1,1,,
400009664058,400009664058P,13806529,104,0,0,WDW - FLOWER & GARDEN,8-224-6122/5866
2番目のファイル:
400000276151,400000276151P,ALL,0,0,0,,
400000276151,400000276151P,A-80007823,0,0,0,,
400000209692,400000209692P,ALL,8,1,1,,
そしてファイル10まで続きます。
ベストアンサー1
#!/bin/bash
file_name="huge.file"
#get file mask
my_mask="$(date +"$file_name-%F-")"
#collect lines with same item in one string separated by unexpected symbol
sed ':1;N;/^\([^,]\+,\).*\n\1/s/\n/×/;t1;P;D' "$file_name" > tmp.file
#divide tmp.file for 10 pieces without line splitting
split -dn l/10 "tmp.file" "$my_mask"
#split lines with same item back
sed -i 's/×/\n/g' "$my_mask"*
#remove tmp.file if need it
rm tmp.file