我想用以下算法拆分文件。
此CSV有3600行以前按名称按字母排序(sort -k2 -n file.csv
)
目前我可以运行此命令以相同的行数拆分文件:
split -l ${MAX_NUMBER_OF_LINES} filename.csv ${new_file_pattern}.
但最初的要求是:
分成${MAX_NUMBER_OF_LINES}
的块
例如:
如果我有${MAX_NUMBER_OF_LINES} = 3
,如果找不到列的最后一个字母的更多副本,我可以将文件拆分为300行的块。
如果LINE 301有" Arboreal Peaches"无论${MAX_NUMBER_OF_LINE}
已经到达,脚本都必须添加到当前的块中。
有点令人困惑的解释..我希望你们中的任何人都可以帮助我(我已经在这个算法中花了2天)
更新
${MAX_NUMBER_OF_LINES} = 3
示例CSV(用于更少行的用途)。 拆分命令达到$ {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'
答案 0 :(得分:0)
这样的东西?在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
。