我想使用以下算法拆分文件。
该CSV有一个3600行,之前由Name alpabetaly(sort -k2 -n file.csv
(订购
目前,我可以运行此命令将文件拆分为相等数量的行:split -l ${MAX_NUMBER_OF_LINES} filename.csv ${new_file_pattern}.
但最初的要求是:拆分为${MAX_NUMBER_OF_LINES}
的块,除非不再存在具有列2的第一个字母的记录。
例如:如果我有${MAX_NUMBER_OF_LINES} = 3
,如果没有发现列的最后一个第一个字母出现,我可以将文件拆分为300行的块。
如果LINE 301有一个带有"Arboreal Peaches"的记录,则无论${MAX_NUMBER_OF_LINE}
已经到达,脚本都必须添加到当前块中。
这是一种令人困惑的解释。。我希望你们中的任何人都能帮助我(我已经在这个算法上花了2天时间(
更新
${MAX_NUMBER_OF_LINES} = 3
CSV示例(例如,行数较少(。Split命令到达${MAX_NUMBER_OF_LINES},但第4行已经有一个字母为a 的记录
'Aberdeen Research", 'Los Angeles', 'California'
'Aplueyo Labs", 'Los Angeles', 'US'
'Acar Media Group", 'Los Angeles', 'US'
'Aberdeen Research", 'San Jose', 'US'
'Beethoven Inc", 'San Jose', 'US'
预期结果
拆分文件
1
'Aberdeen Research", 'Los Angeles', 'California'
'Aplueyo Labs", 'Los Angeles', 'US'
'Acar Media Group", 'Los Angeles', 'US'
'Aberdeen Research", 'San Jose', 'US'
2
'Beethoven Inc", 'San Jose', 'US'
类似的东西?在awk中:
$ cat split.awk
BEGIN {if(max=="")
print "Invalid numer of lines"; exit # exit if no max
}
(a=substr($0,2,1)) && ++c>=max && prev!=a { # first letter to a, if count >= max
c=0 # and first letter changes
fc++ # reset count and filemask counter
}
{
print $0 > (mask==""?"x":mask) (fc==""?0:fc) # write to file default mask x
prev=a # remember previous first letter
}
运行它:
$ awk -v max=3 -v mask="file" -f split.awk file.csv
$ cat file0
'Aberdeen Research", 'Los Angeles', 'California'
'Aplueyo Labs", 'Los Angeles', 'US'
'Acar Media Group", 'Los Angeles', 'US'
'Aberdeen Research", 'San Jose', 'US'
$ cat file1
'Beethoven Inc", 'San Jose', 'US'
mask
是文件名前缀或$new_file_pattern
,max
是$MAX_NUMBER_OF_LINES
,即在命令行集合-v max=$MAX_NUMBER_OF_LINES -v mask=$new_file_pattern
中。