2014-01-06 121 views
1

我想要一种快速方法将csv文件拆分为N个大致相等的部分,并使每个部分都具有原始头文件作为第一行。 到目前为止,我想出了这一点,其中工程(N = 5):将csv文件拆分为多个部分,复制头文件

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命令。

谢谢!

回答

4

根本不需要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 
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 
+0

对,我不应该将头添加到foo0000.txt两次,这是原代码正在做的。 – grasshopper