Вы можете сделать это довольно простым способом, сохранив счетчик имени файла и используя sprintf
, чтобы создать имя файла для каждой последующей группы файлов.Вы используете FNR
(номер записи файла), чтобы различать первую и последующие записи.
Например:
$ sort -t, -k2 file.csv |
awk -F, -v cnt=1 -v fn="testsort_1.csv" '
FNR==1 {
prev=$2
print $0 > fn
}
FNR>1 {
if ($2!=prev) {
cnt++
fn=sprintf("%s_%d.csv", "testsort", cnt)
}
print $0 > fn
prev=$2
}'
( примечание: вы установилиначальное имя файла в качестве переменной для начала, а затем создайте все последующие имена файлов из вашего cnt
(количество) с помощью sprintf
. prev
отслеживает второе поле из предыдущей записи. fn
- это имя файла, созданное sprintf
и счетчик.)
Более короткая версия того же сценария, первоначально объявляющего prev
переменной, будет:
sort -t, -k2 file.csv |
awk -F, -v cnt=0 -v prev="" '{
if ($2!=prev) {
cnt++
fn = "testsort_" cnt ".csv"
prev=$2
}
print $0 > fn
}'
Если вы не хотите иметь последовательно пронумерованные файлы,но вместо того, чтобы получить "testsort_number.csv"
, взятый из отсортированных записей, посмотрите на @ Cyrus теперь удаленный ответ, который обеспечивает превосходное (и более короткое) решение в этом отношении.(Я вижу, у вас уже есть отличный ответ)
Пример использования / Вывод
Если вы введете file.csv
, будут созданы следующие выходные файлы:
$ for i in testsort_{1..3}.csv; do printf "\n%s\n" $i; cat $i; done
testsort_1.csv
WH_01,TRAINAMS,A10,1221-ESD
WH_01,TRAINAMS,A10,PWR-120
WH_01,TRAINAMS,A101,PWR-120
testsort_2.csv
WH_02,TRAINCLE,A1,074-HD-SATA
WH_02,TRAINCLE,A15,102-55665
testsort_3.csv
WH_03,TRAINLON,L10A3,3005-20
WH_03,TRAINLON,L10A3,3005-21
WH_03,TRAINLON,UK-B3,101859