根据两列将这个csv / xls拆分成单独的文件?

我有一个35 MB的Excel文件,这些列:

Index, Name, Year, AgeGroup1, AgeGroup2, AgeGroup3 [...] 1, Sweden, 1950, 20, 25, 27 2, Norway, 1950, 22, 27, 28 2, Sweden, 1951, 24, 24, 22 

我想根据“名称”列将文件拆分成多个csv文件(最好也根据此列中的值命名文件)。
我也想按“年份”对文件进行sorting(但这当然可以事先在Excel中完成)。

一个bash脚本或水壶/ Pentaho解决scheme将不胜感激。 (替代品也是受欢迎的。)

我刚刚使用了你粘贴的示例数据。

awk oneliner可以为你做:

  awk -F, 'NR==1{title=$0;next} { print >> ($2".csv");colse}' yourCSV 

见下面testing:

 kent$ l total 4.0K -rw-r--r-- 1 kent kent 136 2011-10-05 11:04 t kent$ cat t Index, Name, Year, AgeGroup1, AgeGroup2, AgeGroup3 1, Sweden, 1950, 20, 25, 27 2, Norway, 1950, 22, 27, 28 2, Sweden, 1951, 24, 24, 22 kent$ awk -F, 'NR==1{title=$0;next} { print >> $2".csv"}' t kent$ head *.csv ==> Norway.csv <== 2, Norway, 1950, 22, 27, 28 ==> Sweden.csv <== 1, Sweden, 1950, 20, 25, 27 2, Sweden, 1951, 24, 24, 22 

更新

  awk -F, 'NR>1{ fname=$2".csv"; print >>(fname); close(fname);}' yourCsv 

如果awk可接受,则导出到csv并运行以下命令:

 awk -F, '{ print > ($2 ".csv") }' OFS=, infile.csv 

如果您:

  1. 想要保留所有文件中的标题行。
  2. 由于打开的文件太多而导致出错。

要在Excel外sorting文件:

 sort -t, -k3,3n infile.csv | awk ... 

编辑:这将处理大部分问题(除了同时打开的文件):

 { read printf '%s\n' "$REPLY" sort -bt, -k3,3 } < infile | awk -F', *' 'NR == 1 { h = $0; next } { f = $2 ".csv" if (!_[f]++) print h > f print > f }' OFS=', ' 

如果你点击了awk实现的“打开的文件太多”的限制,你可以使用这样的东西:

 awk -F, 'NR > 1 { if (f) close (f) f = $2 ".csv" print > f }' OFS=, infile