Дано
$ cat > file.csv
"Product ID";"Product Name";"Price";"Description";
"11;"Example";"200";"Descripcion here...";
"21;"Example2";"300";"Some here...";
затем
$ awk -F';' 'NR>1 {print "{" $0 "}" > substr($1,2) ".csv"}' file.csv
приводит к
$ head ??.csv
==> 11.csv <==
{"11;"Example";"200";"Descripcion here...";}
==> 21.csv <==
{"21;"Example2";"300";"Some here...";}
awk '
FNR==1{
if (!($0 in h)){file=h[$0]=i++}
else{file=h[$0];next}
}
{print >> (file)}
' *.txt
Если awk находится в первой строке файла:
h
, то в качестве имени файла установить числоi++
(изначально нулевое ), а также поместить его в ключ $0
массива. h
), получить имя файла из массива и прочитать следующую строку. Наконец, строка печатается в соответствующий файл.
But I get "too many open files" or something of the sort.
GNU awk обрабатывает открытие и закрытие файлов по требованию, чтобы обойти это, но другие awk могут этого не делать. В таком случае выберите
awk '
FNR==1{
if (!($0 in h)||file!=h[$0]){close(file)}
if (!($0 in h)){file=h[$0]=i++}
else{file=h[$0];next}
}
{print >> (file)}
' *.txt
Имейте в виду, что это может быть медленнее.