2017-02-11 10 views
1

Привет У меня есть CSV-файл, как так:AWK сохранить заголовок в выходной

order,account,product 
23023,Best Buy,productA 
20342,Best Buy,productB 
20392,Wal-Mart,productC 

Я использую это решение из предыдущей теме:

awk -F ',' '{ print > ("split-" $2 ".csv") }' dataset1.csv 

Однако выход производит 2 файлов без заголовков:

File1

23023,Best Buy,productA 
20342,Best Buy,productB 

File2

20392,Wal-Mart,productC 

Как я могу изменить решение AWK выше, чтобы сохранить строку заголовка в каждом разделенном файле, так что выход напоминает:

Файл 1

order,account,product 
23023,Best Buy,productA 
20342,Best Buy,productB 

file2

order,account,product 
20392,Wal-Mart,productC 

Большое спасибо!

ответ

0

Вы можете использовать этот скрипт AWK:

script.awk

NR == 1 { header = $0; next} 
     { fname = "split-" $2 ".csv" 
     if(!($2 in mem)) { 
      print header > fname 
      mem[ $2 ] = 1 
     } 
     print > fname 
     } 

Вы можете использовать его как это: awk -F, -f script.awk dataset1.csv

Объяснение

  • header хранится при чтении первой строки данных из файла данных в первой строке сценария
  • для других линий передачи данных, сценарий пишет header в fname, но только на первую запись в fname
  • это достигается за счет хранения $2 в mem
+0

не работает для меня, я получаю заголовок для каждой строки файла Best Buy. Где функция 'not()' определена? Или вы просто хотите 'if (! ($ 2 in mem))'? –

+0

@glennjackman Да, я имел в виду '!' Спасибо. –

+0

'mem [$ 2] = 1' не нужно,' mem [$ 2] 'достаточно без назначения, поскольку вы проверяете ключ в массиве, а не значение массива. – karakfa

1

Я хотел бы написать следующим образом:

awk -F, ' 
    NR == 1 { header = $0; next} 
    !($2 in files) { 
     files[$2] = "split-" $2 ".csv" 
     print header > files[$2] 
    } 
    { print > files[$2] } 
' dataset1.csv 
+0

Спасибо, это сработало очень хорошо! – brandon

0

другой аналогичный awk

awk -F, 'NR==1 {h=$0; next} 
       {file="split-" $2 ".csv"; 
       print (a[file]++?"":h ORS) $0 > file}' input 

a[file]++ является счетчиком строк индексируются выходным файлом, вставьте заголовок прилагаемый с ORS только перед первой строкой, которая станет заголовком для каждого разделенного файла.

+0

Спасибо за решение, это тоже сработало очень хорошо! – brandon