Ho un file di input delimitato da virgole (,
). Ci sono alcuni campi racchiusi tra virgolette che contengono una virgola. Ecco la riga di esempio
123,"ABC, DEV 23",345,534.202,NAME
Ho bisogno di rimuovere tutte le virgole che si verificano all'interno delle virgolette doppie e anche delle virgolette doppie. Quindi la riga sopra dovrebbe essere analizzata come mostrato di seguito
123,ABC DEV 23,345,534.202,NAME
Ho provato quanto segue usando sed
ma non dando i risultati attesi.
sed -e 's/(".*),(".*)/1 2/g'
Qualsiasi trucco veloce con sed
, awk
o qualsiasi altra utilità Unix, per favore?
Risposta accettata:
Se le virgolette sono bilanciate, vorrai rimuovere le virgole tra ogni altra virgoletta, questo può essere espresso in awk
così:
awk -F'"' -v OFS='' '{ for (i=2; i<=NF; i+=2) gsub(",", "", $i) } 1' infile
Uscita:
123,ABC DEV 23,345,534.202,NAME
Spiegazione
Il -F"
fa in modo che awk separi la riga in corrispondenza dei segni delle virgolette, il che significa che ogni altro campo sarà il testo tra le virgolette. Il ciclo for esegue gsub
, abbreviazione di globalmente sostituto, su ogni altro campo, sostituendo la virgola (","
) senza nulla (""
). Il 1
alla fine invoca il blocco di codice predefinito:{ print $0 }
.