J'ai un fichier d'entrée délimité par des virgules (,
). Certains champs sont entourés de guillemets doubles et contiennent une virgule. Voici l'exemple de ligne
123,"ABC, DEV 23",345,534.202,NAME
Je dois supprimer toutes les virgules apparaissant à l'intérieur des guillemets doubles et des guillemets doubles également. Ainsi, la ligne ci-dessus doit être analysée comme indiqué ci-dessous
123,ABC DEV 23,345,534.202,NAME
J'ai essayé ce qui suit en utilisant sed
mais ne donnant pas les résultats attendus.
sed -e 's/(".*),(".*)/1 2/g'
Toutes les astuces rapides avec sed
, awk
ou tout autre utilitaire unix s'il vous plaît ?
Réponse acceptée :
Si les guillemets sont équilibrés, vous voudrez supprimer les virgules entre tous les autres guillemets, cela peut être exprimé en awk
comme ceci :
awk -F'"' -v OFS='' '{ for (i=2; i<=NF; i+=2) gsub(",", "", $i) } 1' infile
Sortie :
123,ABC DEV 23,345,534.202,NAME
Explication
Le -F"
awk sépare la ligne au niveau des guillemets doubles, ce qui signifie que tous les autres champs seront le texte entre guillemets. La boucle for exécute gsub
, abréviation de substitut global, sur tous les autres champs, remplaçant la virgule (","
) sans rien (""
). Le 1
à la fin invoque le bloc de code par défaut :{ print $0 }
.