Bash:拆分2个因子/变量

时间:2016-10-05 15:19:17

标签: bash algorithm shell csv sh

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

此CSV有3600行以前按名称按字母排序(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(用于更少行的用途)。 拆分命令达到$ {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'

1 个答案:

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