Группируйте файлы с одинаковым заголовком, а затем объединяйте их

Дано

$ 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...";}
2
01.08.2020, 01:01
1 ответ
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

Имейте в виду, что это может быть медленнее.

2
18.03.2021, 23:16

Теги

Похожие вопросы