Il modo molto più semplice è usare tr
$ tr '_' ',' < input.csv | tr -d '"'
1,1,0,0,76
1,1,0,0,77
1,1,0,0,78
Il modo in cui funziona è che tr
richiede due argomenti: set di caratteri da sostituire e loro sostituzione. In questo caso abbiamo solo set di 1 carattere. Reindirizziamo il flusso stdin input.csv
dell'input tr
tramite l' <
operatore shell e reindirizziamo l'output risultante tr -d '"'
per eliminare le virgolette doppie.
Ma awk
può farlo anche.
$ cat input.csv
"1_1_0_0_76"
"1_1_0_0_77"
"1_1_0_0_78"
$ awk '{gsub(/_/,",");gsub(/\"/,"")};1' input.csv
1,1,0,0,76
1,1,0,0,77
1,1,0,0,78
Il modo in cui funziona è leggermente diverso: awk legge ogni file riga per riga, essendo ogni script in linea /Pattern match/{ codeblock}/Another pattern/{code block for this pattern}
. Qui non abbiamo un modello, quindi significa eseguire il codeblock per ogni riga. gsub()
La funzione viene utilizzata per la sostituzione globale all'interno di una riga, quindi la usiamo per sostituire i trattini bassi con virgole e le doppie virgolette con una stringa nulla (eliminando efficacemente il carattere). Il 1
è al posto del pattern match con mancante blocco di codice, il cui valore predefinito semplicemente alla stampa la linea; in altre parole il codeblock con gsub()
fa il lavoro e 1
stampa il risultato.
Utilizzare il reindirizzamento della shell ( >
) per inviare l'output a un nuovo file:
awk '{gsub(/_/,",");gsub(/\"/,"")};1' input.csv > output.csv