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 trrichiede due argomenti: set di caratteri da sostituire e loro sostituzione. In questo caso abbiamo solo set di 1 carattere. Reindirizziamo il flusso stdin input.csvdell'input trtramite l' <operatore shell e reindirizziamo l'output risultante tr -d '"'per eliminare le virgolette doppie.
Ma awkpuò 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 1stampa il risultato.
Utilizzare il reindirizzamento della shell ( >) per inviare l'output a un nuovo file:
awk '{gsub(/_/,",");gsub(/\"/,"")};1' input.csv > output.csv