Эта команда GNU awk делает свое дело:
awk -F ',' 'NR==1{h=$0; next};!seen[$1]++{f=$1".csv"; print h > f};{f=$1".csv"; print >> f; close(f)}' input.csv
Предостережение: это не сработает, если в первом поле есть экранированные запятые. Запятые в других полях должны работать нормально.
] Объяснение:
-F ','
(разделитель полей) гарантирует, что $ 1
и т. Д. Относятся к столбцам CSV, а не к значениям, разделенным пробелами. NR == 1 {h = $ 0; next}
специально обрабатывает первую строку ( NR == 1
), сохраняя полную строку заголовка в переменной h
( h = $ 0
]) и пропуск строки ( next
). ! seen [$ 1] ++ {f = $ 1 ".csv"; print h> f}
обрабатывает первое вхождение любого $ 1
специально (! Замечено [$ 1]
), сохраняя $ 1
, за которым следует .cs v
в переменную имени файла f
и сохранение заголовка в этот файл ( напечатайте h> f
). {f = $ 1 ".csv"; print >> f; close (f)}
добавляет текущую строку в файл ( print >> f
) и закрывает файловый дескриптор ( close (f)
), чтобы не хранить его один раз выполняется обработка всех строк с определенным идентификатором. Бонус: если вы замените $ 1
другим полем, оно должно сделать то, что вы ожидаете: создать файл для каждого уникального значения в этом столбце со строками, содержащими это значение в данном столбце.