使用AWK按行计数拆分文件,同时附加单独的标头

时间:2014-10-20 19:46:14

标签: csv awk header-files

假设我有一行名为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个文件中。

2 个答案:

答案 0 :(得分:0)

  1. AWK不仅可以匹配regexp,还可以匹配任何布尔值。匹配当前行号NR以查找第一行和其余行。 NR == 1 {head = $ 0}
  2. 当每个第x行,分别生成新文件名和打印头到文件中。在我的情况下每隔5个: NR%5 == 2 {filename = int((NR-1)/ 5)+1;打印头> filename}
  3. 将其余行打印成当前文件名: NR!= 1 {print>> filename}

    cat file100.csv | awk' NR == 1 {head = $ 0} NR%5 == 2 {filename = int((NR-1)/ 5)+1" .file100.csv&#34 ;;打印头> filename} NR!= 1 {print>> filename}'

答案 1 :(得分:0)

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}将每行打印到当前文件。