はるかに簡単な方法は使用することです tr
$ tr '_' ',' < input.csv | tr -d '"'
1,1,0,0,76
1,1,0,0,77
1,1,0,0,78
これが機能する方法は、tr
2つの引数-置換される文字のセットとその置換- を取ることです。この場合、1文字のセットしかありません。input.csv
入力tr
のstdinストリームを<
シェルオペレーター経由でリダイレクトし、結果の出力をtr -d '"'
にパイプして二重引用符を削除します。
しかし、awk
それもできます。
$ 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
これが機能する方法は少し異なります。awkは各ファイルを1行ずつ読み取り、各インラインスクリプトは/Pattern match/{ codeblock}/Another pattern/{code block for this pattern}
です。ここにはパターンがないので、各行に対してコードブロックを実行することを意味します。gsub()
関数は、行内のグローバル置換に使用されるため、アンダースコアをコンマで置き換え、二重引用符をnull文字列で置き換えます(文字を効果的に削除します)。1
デフォルト単にラインを印刷するためのコード・ブロックを、欠落してパターンマッチの代わりになります。言い換えると、コードブロックのあるgsub()
ものがジョブを実行1
し、結果を出力します。
シェルリダイレクト(>
)を使用して、出力を新しいファイルに送信します。
awk '{gsub(/_/,",");gsub(/\"/,"")};1' input.csv > output.csv