Je veux extraire des données entre " " à partir d'un fichier de données ayant comme délimiteur une virgule.
Exemple de fichier d'entrée :
,7/30/2019,7/31/2019,Wed,8/1/2019,FH/FN 30yr & 20yr TBA & Spec ,"10,000",8/13/2019,
O/P attendu :
,7/30/2019,7/31/2019,Wed,8/1/2019,FH/FN 30yr & 20yr TBA & Spec ,"10000",8/13/2019,
Réponse acceptée :
En supposant qu'il s'agit d'un CSV correctement formaté (les données d'exemple semblent correctes à cet égard), nous pouvons utiliser csvformat
depuis csvkit
pour remplacer temporairement les délimiteurs de champ par un autre caractère non présent dans les données, tel que @
, supprimez toutes les virgules et remettez à nouveau le délimiteur de champ par défaut :
$ csvformat -D '@' file.csv | tr -d , | csvformat -d '@'
,7/30/2019,7/31/2019,Wed,8/1/2019,FH/FN 30yr & 20yr TBA & Spec ,10000,8/13/2019,
La sortie n'a pas de guillemets autour du champ que nous avons modifié, mais c'est parce qu'elle n'en a plus besoin.
Évidemment, "supprimer toutes les virgules" peut supprimer des virgules que nous ne voulons pas réellement supprimer, nous pouvons donc être un peu plus sélectifs et ne supprimer que les virgules du 7ème champ :
$ csvformat -D '@' file.csv | awk -F '@' 'BEGIN { OFS=FS } { gsub(",", "", $7); print }' | csvformat -d '@'
,7/30/2019,7/31/2019,Wed,8/1/2019,FH/FN 30yr & 20yr TBA & Spec ,10000,8/13/2019,