Citar as duas primeiras colunas no arquivo .csv grande

2

Eu tenho um arquivo csv grande com cerca de 25 milhões de linhas e 256 colunas. O separador de campo do arquivo CSV é ~ character.

Eu quero substituir os dados da primeira coluna 2 como esse

From : data1~data2~data3..................................
To   : "data1"~"data2"~data3................................

Atualmente, estou usando awk , mas desta forma:

cat file | awk -F "~" '{print "\""$1"\"""\""$2"\"~"$3"~"$4"~"...................}'

Então eu estou digitando 256 colunas no awk como $4"~"$5"~"$6"~".....$256"~"

Existe alguma outra maneira melhor de codificá-lo?

    
por Murat 18.10.2017 / 09:17

2 respostas

2

Não, você não precisa especificar todos os 256 arquivamentos, faça o seguinte para alterar apenas a primeira e a segunda coluna e, em seguida, execute print com OFS='~' e evite cat ing para awk enquanto awk pode ler do arquivo também sozinho.

awk -F'~' '{$1="\""$1"\""; $2="\""$2"\""; print}' OFS='~' infile

Para alterar os dois últimos campos.

awk -F'~' '{$(NF-1)="\""$(NF-1)"\""; $NF="\""$NF"\""; print}' OFS='~' infile
    
por 18.10.2017 / 09:31
1

Com sed , costumamos escrever

sed 's/[^~]*/"&"/;s//"&"/2'

Mas, como você mencionou um arquivo grande, esse provavelmente será muito mais rápido do que a solução acima ou a awk versão:

sed 's/\(^[^~]*\)~\([^~]*\)/""~""/'

Ou talvez mais fácil de ler, com expressões regulares estendidas:

sed -E 's/(^[^~]*)~([^~]*)/""~""/'
    
por 18.10.2017 / 09:49