我有一个包含这些列的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文件(最好还根据此列中的值命名文件)。
我也希望文件按“年份”排序(但这当然可以事先在Excel中完成。)
非常感谢bash脚本或Kettle / Pentaho解决方案。 (也欢迎替代方案。)
答案 0 :(得分:2)
我刚刚使用了您粘贴的示例数据。
awk oneliner可以为你做到:
awk -F, 'NR==1{title=$0;next} { print >> ($2".csv");colse}' yourCSV
见下面的测试:
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
答案 1 :(得分:0)
如果awk可以接受,请导出到 csv 并运行以下命令:
awk -F, '{
print > ($2 ".csv")
}' OFS=, infile.csv
如果您:
报告要在Excel之外对文件进行排序:
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