GNU/Linux >> Tutoriels Linux >  >> Linux

Supprimer la virgule entre les guillemets uniquement dans un fichier délimité par des virgules ?

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 } .


Linux
  1. Script Bash pour supprimer le fichier le plus ancien d'un dossier ?

  2. La différence entre les liens symboliques et les liens matériels ?

  3. Comment supprimer le Bom d'un fichier UTF-8 ?

  4. Remplacer les données entre guillemets dans un fichier ?

  5. Supprimer les lignes vides dans un fichier texte via grep

Zsync - Un utilitaire de transfert de fichiers pour télécharger uniquement les nouvelles parties d'un fichier

Quelle est la différence entre l'impression et l'impression dans Awk ?

Comment obtenir uniquement le nombre de lignes d'un fichier

Quelle est la différence entre fsync et syncfs ?

Supprimer un fichier sous Linux en utilisant le numéro d'inode

Script bash pour supprimer le fichier le plus ancien d'un dossier