Um arquivo data.csv
tem os seguintes dados
1,avocado,mexican green fruit
1,kiwi,green fruit
1,banana,yellow fruit
1,mango,yellow fruit
Para organizar os dados em categorias de frutas, fiz
awk -F ',' '{print >> ($3 ".csv")}' data.csv
que cria 3 arquivos, mexican green fruit.csv
, green fruit.csv
,yellow fruit.csv
Eu quero que os espaços nos nomes desses arquivos sejam substituídos por sublinhados_
Assim, os nomes dos arquivos devem ser mexican_green_fruit.csv
, green_fruit.csv
,yellow_fruit.csv
Precisa de ajuda neste awk
forro para fazer isso
Procurando por uma awk
única resposta
Uma resposta somente awk (como o OP solicitou) para GNU awk seria:
Uma resposta somente awk para qualquer awk POSIX se sua entrada for pequena o suficiente para que você não possa exceder o limite de "muitos arquivos abertos" seria:
Uma resposta somente awk para qualquer awk POSIX se você exceder o limite de "muitos arquivos abertos" seria:
mas esse último seria lento, pois está fechando e reabrindo o arquivo de saída para cada gravação e assume que você pode armazenar todos os
$3
valores na memória. Você pode torná-lo um pouco mais eficiente fechando apenas o arquivo de saída se/quando ele mudar:Se você estiver de acordo com uma resposta que não seja apenas awk, então usando o idioma DSU (Decorate/Sort/Undecorate) usando qualquer awk POSIX, sort e cut, o seguinte funcionará de forma eficiente e robusta para qualquer tamanho de arquivo de entrada que
sort
pode manipular (e foi projetado para usar paginação por demanda, etc. para lidar com arquivos extremamente grandes) e para qualquer número de arquivos de saída:Para obter mais informações sobre o DSU, consulte https://stackoverflow.com/questions/71691113/how-to-sort-data-based-on-the-value-of-a-column-for-part-multiple-lines-of- af/71694367#71694367 .
Poderia ser feito com uma função por exemplo:
Aqui, substituindo cada sequência de um ou mais caracteres de espaço em branco (incluindo espaço, tabulação, cr...) por
_
.(com gnu awk ou similar) Você pode executar algo ao longo das linhas de
gensub
é um funcionalsub
-- ligeiramente fácil de compor.>
é provavelmente melhor do que a>>
menos que você tenha algum csv criado antes que este comando seja executado.Edit: para lidar com novos requisitos (na verdade, uma nova pergunta)