【问题标题】:Splitting a file by line count using AWK while appending a separate header使用 AWK 按行数拆分文件,同时附加单独的标题
【发布时间】:2014-10-20 19:46:13
【问题描述】:

假设我有一个名为 file100.csv 的 101 行文件,第一行是标题。我希望能够将该文件拆分为 10 个名为 N.file100.csv 的 1+10 行文件,其中 N = 1-10,并且将标题作为第一行添加到所有 10 个文件中

到目前为止,我可以隔离标题并拆分文件没有问题:

head -n 1 file100.csv > tmpHeader
tail -n +2 file100.csv | awk '{filename = int((NR-1)/10)+1 ".file100.csv"; print >> filename}' -

我遇到的问题是将该头文件作为第一行附加到所有后续 10 个文件中。

【问题讨论】:

    标签: csv awk header-files


    【解决方案1】:
    awk 'NR==1 {a=$0; next} (NR-2)%10==0 {filename = int((NR-2)/10)+1 ".file100.csv"; print a >> filename} {print >> filename}' file100.csv
    

    说明:

    • NR==1 {a=$0; next} 读取文件的第一行并将标题存储在变量a 中。
    • (NR-2)%10==0 {filename = int((NR-2)/10)+1 ".file100.csv"; print a >> filename} 生成文件名,它与您的命令中的相同。我们只需要在文件名更改时写入标题。考虑到标题附带的偏移量,这是每 10 行。
    • {print >> filename} 将每一行打印到当前文件。

    【讨论】:

      【解决方案2】:
      1. AWK 不仅可以匹配正则表达式,还可以匹配任何布尔值。匹配当前行号 NR 以查找第一行和其余行。 NR == 1 { head = $0 }
      2. 每第 x 行时,生成新的文件名并在文件中分别打印标题。在我的情况下,每 5 次: NR % 5 == 2 { filename =int((NR-1)/5)+1;打印头>文件名}
      3. 将其余行打印到当前文件名中:NR != 1 { print >> filename }

        猫文件100.csv | awk 'NR == 1 { 头 = $0 } NR % 5 == 2 { 文件名 = int((NR-1)/5)+1 ".file100.csv";打印头 > 文件名 } NR != 1 { 打印 >> 文件名 }'

      【讨论】:

        猜你喜欢
        • 2017-03-11
        • 2013-03-04
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-03-23
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多