Atribuições de valor de cotação dupla armazenadas em um CSV?

4

Eu tenho um arquivo que contém texto da seguinte forma:

dt=2016-06-30,path=path1,site=US,mobile=1
dt=2016-06-21,path=path2,site=UK,mobile=0

Eu quero convertê-lo em texto com valores com aspas duplas nos pares de valores-chave, assim:

dt="2016-06-30",path="path1",site="US",mobile="1"
dt="2016-06-21",path="path2",site="UK",mobile="0"

Como posso colocar todos os valores entre aspas duplas, usando Sed ou qualquer outro comando?

    
por Shalaj Shukla 10.11.2016 / 08:24

4 respostas

7

Usando Sed

sed -e 's/=\([^,]*\)/=""/g' file.txt

Usando o Awk

awk -F, -v OFS=, '{for (f=1;f<=NF;f++) {sub(/=/,"&\"",$f); sub(/$/,"\"",$f)}; print}' file.txt

Ou mais curto:

awk -F, -v OFS=, '{for (f=1;f<=NF;f++) {gsub(/=|$/,"&\"",$f)} print}' file.txt 

Mais curto ainda:

awk -F, -v OFS=, '{for (f=1;f<=NF;f++) {gsub(/=|$/,"&\"",$f)}} 1' file.txt 

Usando ex

O Ex foi projetado para edição de arquivos , mas você pode visualizar as alterações sem salvá-las de volta no arquivo da seguinte forma:

ex -sc '%s/=\([^,]*\)/=""/g | %p | q!' file.txt 

Para realmente fazer as alterações e salvá-las no arquivo, use:

ex -sc '%s/=\([^,]*\)/=""/g | x' file.txt

No entanto, se você der um padrão que não é encontrado em nenhum lugar do arquivo (por exemplo, não há = em qualquer lugar no arquivo), então Ex não será encerrado automaticamente. Assim, para uma melhor robustez, costumo usar printf para passar comandos para Ex:

printf '%s\n' '%s/=\([^,]*\)/=""/g' %p | ex file.txt

E para salvar as alterações:

printf '%s\n' '%s/=\([^,]*\)/=""/g' x | ex file.txt
    
por 10.11.2016 / 08:32
4

com perl

$ # unlike sed/awk, newline is still part of input record
$ perl -pe 's/=\K[^,\n]*/"$&"/g' ip.txt 
dt="2016-06-30",path="path1",site="US",mobile="1"
dt="2016-06-21",path="path2",site="UK",mobile="0"

$ # or chomp newline and add it back while printing
$ perl -lpe 's/=\K[^,]+/"$&"/g' ip.txt
dt="2016-06-30",path="path1",site="US",mobile="1"
dt="2016-06-21",path="path2",site="UK",mobile="0"
    
por 10.11.2016 / 08:54
3

Usando o awk

awk '{gsub(/=/, "=\""); gsub(/,/,"\","); print $0"\""}' < file.txt
    
por 10.11.2016 / 08:42
0

Usando Miller :

$ mlr put 'for (k,v in $*) {$[k] = "\"".v."\""}' mobile.dat
dt="2016-06-30",path="path1",site="US",mobile="1"
dt="2016-06-21",path="path2",site="UK",mobile="0"
    
por 11.11.2016 / 13:36