Tenho registros em um arquivo texto formatado da seguinte forma:
Record1
Record1
Record1
Record1
Record2
Record2
Record2
Record2
...
Preciso converter este arquivo para CSV substituindo as 3 primeiras quebras de linha por vírgula e removendo a 4ª, resultando em uma saída como esta:
Record1,Record1,Record1,Record1
Record2,Record2,Record2,Record2
...
Qual é a melhor maneira de fazer isso no Bash, onde o melhor é mais robustez do que desempenho - a tarefa não será realizada com frequência, mas precisa permitir que os valores contenham praticamente quaisquer caracteres além de espaços em branco e quebras de linha.
Eu usaria o awk para isso
Definir RS como uma string vazia significa que 2 ou mais novas linhas separam os registros.
O separador de campo é uma única nova linha.
$1 = $1
é uma forma idiomática de forçar o awk a reescrever o registro atual usando o separador de campo de saída.Apenas por diversão, um python one-liner[1] para criar o resultado esperado:
linhas:
Ao colar o texto acima (sem o $ inicial) em um terminal (bash), você obterá isto...
... ao ler 'registros' contendo o texto de amostra (repetido)...
É um passo simples remover todos aqueles ",END"; por exemplo, canalize tudo para sed, por exemplo;
anexe
| sed -re "s/,END$//"
à última linha.[1] O texto acima é melhor digitado em uma única linha, basta pular os
\
's, que foram adicionados para melhor legibilidade AQUI.Usando Miller e executando
você consegue
Algumas notas:
skip-trivial-records
para remover linhas vazias;nest --ivar "," -f 1
mesclar os valores dos registros, separando-os por,