将csv文件拆分为多个部分,复制标题

时间:2014-01-06 16:27:03

标签: bash sed split

我想快速将csv文件拆分为N个大致相等的部分,并使每个部分都将原始标题作为第一行。 到目前为止,我已经想出了这个,它有效(N = 5):

split -da 4 -l $((`wc -l < foo.csv`/5)) foo.csv foo --additional-suffix=".csv"
for f in `ls foo0*.csv`;do sed -i "1s/^/`head -n 1 foo.csv`\n/" $f; done;

是否有人知道如何将其转换为单行,我通过拆分为for循环而不是运行ls命令来提供新创建的文件。

谢谢!

2 个答案:

答案 0 :(得分:5)

根本不需要for循环。你可以这样做:

sed -i "1s/^/`head -n 1 foo.csv`\n/" foo0*.csv

我认为您无法通过sed提供新创建的文件,因为split没有为您提供新的文件名。

如果你真的想要一个单行,你可以用&&加入这两个语句:

split -da 4 -l $((`wc -l < foo.csv`/5)) foo.csv foo --additional-suffix=".csv" && sed -i "1s/^/`head -n 1 foo.csv`\n/" foo0*.csv

答案 1 :(得分:2)

不完全是单行,但它确保标题不在任何拆分文件中,然后将其添加到所有文件中。

f=foo.csv
header=$(sed 1q "$f")
split -da 4 -l $(( ($(wc -l < "$f")-1) / 5 )) <(sed 1d "$f") foo --additional-suffix=".csv"
sed -i "1i\\$header" foo0*.csv