Znacznie prostszym sposobem jest użycie tr
$ tr '_' ',' < input.csv | tr -d '"'
1,1,0,0,76
1,1,0,0,77
1,1,0,0,78
Działa to w ten sposób, że trwymaga dwóch argumentów - zestawu znaków do zastąpienia i ich zamiany. W tym przypadku mamy tylko zestawy 1 znaku. Przekierowaniu input.csvwejściowy trstrumieniu użytkownika stdin przez <operatora, powłoki rur i uzyskaną wyjście tr -d '"'aby usunąć podwójne notowania.
Ale też awkmogę to zrobić.
$ 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
Sposób działania jest nieco inny: awk odczytuje każdy plik linia po linii, każdy skrypt jest w linii /Pattern match/{ codeblock}/Another pattern/{code block for this pattern}. Tutaj nie mamy wzorca, więc oznacza to wykonanie kodu dla każdej linii. gsub()funkcja jest używana do globalnego podstawiania w linii, dlatego używamy jej do zastępowania znaków podkreślenia przecinkami, a podwójnych cudzysłowów łańcuchem pustym (skutecznie usuwając znak). 1Jest w miejscu spotkania z wzorca brakuje blok kodu, który domyślnie po prostu do drukowania linii; innymi słowy, kod z gsub()robi zadanie i 1drukuje wynik.
Użyj przekierowania powłoki ( >), aby wysłać dane wyjściowe do nowego pliku:
awk '{gsub(/_/,",");gsub(/\"/,"")};1' input.csv > output.csv