Voglio estrarre i dati tra " " da un file di dati con delimitatore come virgola.
Esempio di file di input:
,7/30/2019,7/31/2019,Wed,8/1/2019,FH/FN 30yr & 20yr TBA & Spec ,"10,000",8/13/2019,
Previsto o/p:
,7/30/2019,7/31/2019,Wed,8/1/2019,FH/FN 30yr & 20yr TBA & Spec ,"10000",8/13/2019,
Risposta accettata:
Supponendo che questo sia CSV formattato correttamente (i dati di esempio sembrano ok sotto questo aspetto), possiamo usare csvformat
da csvkit
per modificare temporaneamente i delimitatori di campo con qualche altro carattere non altrimenti presente nei dati, come ad esempio @
, elimina tutte le virgole e ripristina di nuovo il delimitatore di campo predefinito:
$ 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,
L'output non ha virgolette intorno al campo che abbiamo modificato, ma è perché non ne ha più bisogno.
Ovviamente, "cancellare tutte le virgole" potrebbe eliminare le virgole che in realtà non vogliamo eliminare, quindi possiamo essere un po' più selettivi ed eliminare solo le virgole nel 7° campo:
$ 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,