GNU/Linux >> Linux Esercitazione >  >> Linux

Rimuovere la virgola tra le virgolette solo in un file delimitato da virgole?

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


Linux
  1. La differenza tra "du -sh *" e "du -sh ./*"?

  2. Script Bash per rimuovere il file più vecchio da una cartella?

  3. La differenza tra collegamenti simbolici e hard?

  4. Come rimuovere la Bom da un file Utf-8?

  5. Sostituire i dati tra le citazioni in un file?

Zsync:un'utilità di trasferimento file per scaricare solo le nuove parti di un file

Rimuovi le righe vuote in un file di testo tramite grep

Stampa l'ultima riga di un file, dalla CLI

Come ottenere solo il numero di righe di un file

Rimuovi un file su Linux usando il numero di inode

come rimuovere le virgolette doppie in un csv