2014-10-20 1 views
0

Скажем, у меня есть файл из 101 строки с именем file100.csv, причем первая строка является заголовком. Я хочу разбить этот файл на 10 файлов из 1 + 10 строк с именем N.file100.csv, где N = 1-10, и что заголовок будет добавлен ко всем 10 файлам в качестве первой строкиРазбиение файла по количеству строк с использованием AWK при добавлении отдельного заголовка

So далеко, я могу выделить заголовок и не разобью файлы без проблем:

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

Что у меня возникают проблемы с прикрепляют файл заголовок в качестве первой строки для всех последующих 10 файлов.

ответ

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} генерирует имя файла, это то же самое, что и в вашей команде. Нам нужно написать заголовок, когда имя файла изменится. Это каждая десятая строка, учитывая смещение, поступающее с заголовком.
  • {print >> filename} печатает каждую строку в текущем файле.
0
  1. AWK может соответствовать не только регулярным выражениям, но и любым булевым. Сопоставьте текущий номер строки NR, чтобы найти первую линию линии и остальные строки. NR == 1 {head = $ 0}.
  2. Когда каждая x-я строка генерирует новое имя файла и печатает заголовок отдельно в файл. Каждый пятый в моем случае: NR% 5 == 2 {filename = int ((NR-1)/5) +1; печатающая головка> имя_файла}
  3. печати Остальные строки в текущее имя файла: NR = 1 {печать >> имя файла}

    кошка file100.csv | awk 'NR == 1 {head = $ 0} NR% 5 == 2 {filename = int ((NR-1)/5) +1 ".file100.csv"; ! Печатающая головка> имя_файла} NR = 1 {печать >> имя файла}»

 Смежные вопросы

  • Нет связанных вопросов^_^