Bash:用2个因素/变量拆分



我想使用以下算法拆分文件。

该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_patternmax$MAX_NUMBER_OF_LINES,即在命令行集合-v max=$MAX_NUMBER_OF_LINES -v mask=$new_file_pattern中。

最新更新