Como posso encontrar e substituir por uma nova linha?

3

Eu tenho um CSV delimitado por vírgulas e quero delimitá-lo por novas linhas.

Entrada:

a, b, c

Saída:

a
b
c

Eu escrevi parsers de Java que fazem isso, mas isso não poderia ser feito com vim ou alguma outra ferramenta?

sed não está funcionando para mim:

#!/bin/sh

# Start
cat > infile.csv << __EOF__
a, b, c
__EOF__
cat infile.csv
sed 's/, /\n/g' infile.csv > outfile.csv

cat outfile.csv
    
por simpatico 19.03.2011 / 15:28

4 respostas

7

Semelhante a resposta de Iain , você também pode usar tr :

$ echo a,b,c | tr ',' '\n'
a
b
c

Ambas as respostas assumem que o CSV é simples (ou seja, todas as vírgulas são separadores de campo). Se você tem algo como a,"b,c",d , onde b,c é um único campo, as coisas ficam mais difíceis

    
por 19.03.2011 / 16:38
5

Parece que as outras respostas alcançam o que você deseja e uma ferramenta de script parece ser a opção mais adequada.

Mas você perguntou sobre o vim, então aqui está como você faz isso:

%s/, /\r/g

Ou seja, substitua cada vírgula + espaço por um retorno de carro. Isso será interpretado como o caractere final de linha apropriado para o arquivo. (Você pode verificar isso procurando por \r - ele não será encontrado).

    
por 19.03.2011 / 23:49
2

O uso de \n em um texto de substituição s em sed é permitido, mas não obrigatório, por POSIX. O GNU sed faz isso, mas existem implementações que geram \n literalmente.

Você pode usar qualquer awk compatível com POSIX. Defina o separador do campo de entrada FS para uma expressão regular e o separador do campo de saída ORS para uma cadeia (com a barra invertida usual escapando). A atribuição $1=$ é necessária para reconstruir a linha para usar o separador de campo diferente.

awk -vFS=', *' -vOFS='\n' '{$1=$1; print}'

(Isto assume que sua entrada contém valores simples separados por vírgula e espaço em branco, sem nenhuma cotação. Se houver cotação, você precisará mover para um analisador CSV real em uma linguagem como Perl ou Python.)

    
por 19.03.2011 / 20:41
2

Se o seu arquivo é delimitado por ',' (vírgulas seguidas de espaço), então

sed 's/, /\n/g' filename.csv >newfile

fará o trabalho. Se é delimitado por ',' (vírgulas sem espaços) então

sed 's/,/\n/g' filename.csv >newfile

funcionará.

ou altere o \n para \o12 se seu sabor sed não gostar.

    
por 19.03.2011 / 15:45