我想快速将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命令来提供新创建的文件。
谢谢!
答案 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