como remover todas as aspas duplas do csv, exceto o campo específico

0

Eu quero remover todas as aspas duplas do meu csv, mas não o quarto campo (porque os quatro campos representam o PATH do arquivo)

Por favor, informe como implementar isso por sed ou awk ou perl one liner , etc

O que eu sei agora é usar o comando sed simples como:

   sed s"/\"//g"  file.csv  | sed 's/ //g'

mas este comando não é tão elegante e também funciona no quarto campo (quarto campo não deve ser editado)

Observação - também é necessário excluir espaços vazios entre aspas para caractere próximo

Exemplo (arquivo csv antes)

"24  ","COsc   ","LINUX","/VP/Ame/AR/Celts/COf","  fbsutamante ",fbu2012,"kkk","&^#$@J  ",,,,,
25,COsc,LINUX,"/VP/Ame/AR/Celts/COf","fbsutamante ",fbu2012,"iiii ","   *****",,,,,

Exemplo (arquivo csv depois)

24,COsc,LINUX,"/VP/Ame/AR HR/Ce   lts/COf",fbsutamante,fbu2012,kkk,&^#$@J,,,,,
25,COsc,LINUX,"/VP/Ame/AR HR/Ce   lts/COf",fbsutamante,fbu2012,iiii,*****,,,,,
    
por maihabunash 29.07.2014 / 12:13

2 respostas

3

Isso pode ser uma maneira:

awk 'BEGIN{FS=OFS=","}              # set input and output field separator as comma
     {for (i=5; i<=NF; i++) {       # loop from 5th field
            gsub("\"","", $i);      # remove "
            gsub(/^[ \t]+/,"", $i); # remove leading spaces
            gsub(/[ \t]+$/,"",$i)}  # remove trailing spaces
     }1' file

A remoção da liderança e da fuga baseia-se nesta resposta da BMW: Remover espaço inicial e final em campo no awk .

Teste

$ awk 'BEGIN{FS=OFS=","} {for (i=5; i<=NF; i++) {gsub("\"","", $i); gsub(/^[ \t]+/,"", $i); gsub(/[ \t]+$/,"",$i)}}1' file
24,COsc,LINUX,"/VP/Ame/AR/Celts/COf",fbsutamante,fbu2012,kkk,&^#$@J,,,,,
25,COsc,LINUX,"/VP/Ame/AR/Celts/COf",fbsutamante,fbu2012,iiii,*****,,,,,

Se também tiver que limpar do 1º ao 3º campo, basta adicionar if (i!=4) e percorrer todos os campos:

$ awk 'BEGIN{FS=OFS=","} {for (i=1; i<=NF; i++) {if (i!=4) {gsub("\"","", $i); gsub(/^[ \t]+/,"", $i); gsub(/[ \t]+$/,"",$i)}}}1' a
24,COsc,LINUX,"/VP/Ame/AR/Celts/COf",fbsutamante,fbu2012,kkk,&^#$@J,,,,,
25,COsc,LINUX,"/VP/Ame/AR/Celts/COf",fbsutamante,fbu2012,iiii,*****,,,,,
    
por 29.07.2014 / 12:18
0

Basta remover todos eles e depois colocá-los de volta:

sed 's/"//g;s/,/,"/3;s/,/",/4'
    
por 29.07.2014 / 13:24