como separar linha usando o awk

2

Como posso separar a linha abaixo em um arquivo csv:

(12,'hello','this girl,is lovely(adorable \r\n actually)',goodbye),(13,'hello','this fruit,is super tasty (sweet actually)',goodbye)

abaixo, como duas linhas diferentes:

(12,'hello','this girl,is lovely(adorable \r\n actually)',goodbye)
(13,'hello','this fruit,is super tasty (sweet actually)',goodbye)

Eu tentei usar:

awk -F"[()]" '{print $2}' test.csv 

mas não funcionou e perdeu algumas linhas.

Esses dados são, na verdade, uma consulta SQL e eu preciso extrair os dados e convertê-los em linhas diferentes usando a vírgula após) e antes (como separador de linha

    
por Derek 22.01.2018 / 02:22

2 respostas

1

Este comando do awk pode fazer o que você quiser:

awk -F '),' '{ print $1")" "\n" $2}' source.csv

Resultado:

(12,'hello','this girl,is lovely(adorable \r\n actually)',goodbye)
(13,'hello','this fruit,is super tasty (sweet actually)',goodbye)
    
por 22.01.2018 / 06:35
2

Com GNU sed (e sua entrada de amostra salva em um arquivo chamado ./input ):

$ sed -e 's/),(/)\n(/g' ./input
(12,'hello','this girl,is lovely(adorable \r\n actually)',goodbye)
(13,'hello','this fruit,is super tasty (sweet actually)',goodbye)

Isso altera a vírgula em cada ),( para uma nova linha.

AVISO : Se essa sequência de caracteres ocorrer dentro de seus dados reais, ela também será alterada lá.

Você pode fazer o mesmo em awk , mas há pouca ou nenhuma vantagem sobre o uso de sed :

$ awk 'gsub(/\),\(/,")\n(",$0)' ./input
(12,'hello','this girl,is lovely(adorable \r\n actually)',goodbye)
(13,'hello','this fruit,is super tasty (sweet actually)',goodbye)

A menos que você faça mais processamento na linha de entrada que requer recursos awk , use apenas sed .

    
por 22.01.2018 / 03:53

Tags