ファイルを各ファイルに固有のエントリを含む10個のファイルに分割し、各ファイルの最大行数を制限します。

ファイルを各ファイルに固有のエントリを含む10個のファイルに分割し、各ファイルの最大行数を制限します。

私は巨大なファイル(200万以上のレコード)を持っています。これは私の要件です。

  • まず、大きなファイルを10個の小さなファイルに分割します。
  • ファイルの種類は次のとおりです。 <File_name>- <timestamp>-xx
    • <timestamp>各ファイルの同じ時間
    • xx1から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

おすすめ記事