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 tr
wymaga dwóch argumentów - zestawu znaków do zastąpienia i ich zamiany. W tym przypadku mamy tylko zestawy 1 znaku. Przekierowaniu input.csv
wejściowy tr
strumieniu użytkownika stdin przez <
operatora, powłoki rur i uzyskaną wyjście tr -d '"'
aby usunąć podwójne notowania.
Ale też awk
mogę 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). 1
Jest 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 1
drukuje wynik.
Użyj przekierowania powłoki ( >
), aby wysłać dane wyjściowe do nowego pliku:
awk '{gsub(/_/,",");gsub(/\"/,"")};1' input.csv > output.csv