【问题标题】:Split a csv file into parts, copy header将 csv 文件拆分为多个部分,复制标题
【发布时间】:2014-01-06 16:27:02
【问题描述】:

我想要一种快速的方法将 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 命令来提供新创建的文件。

谢谢!

【问题讨论】:

    标签: bash sed split


    【解决方案1】:

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

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

    我认为您不能通过sed 提供新创建的文件,因为split 不会为您提供新文件名。

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

    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
      

      【讨论】:

      • 对,我不应该两次将header添加到foo0000.txt,这是原始代码所做的。
      猜你喜欢
      • 1970-01-01
      • 2020-06-22
      • 2021-07-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-07-26
      • 1970-01-01
      相关资源
      最近更新 更多