はるかに簡単な方法は、 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()
関数は行内のグローバル置換に使用されるため、アンダースコアをカンマに置き換え、二重引用符をヌル文字列に置き換えるために使用します (文字を効果的に削除します)。 1
欠落しているコードブロックとのパターンマッチの代わりにあり、デフォルトでは単純に行を印刷します。つまり、gsub()
のコードブロック 仕事をして1
結果を出力します。
シェル リダイレクトを使用する (>
) 新しいファイルに出力を送信するには:
awk '{gsub(/_/,",");gsub(/\"/,"")};1' input.csv > output.csv
代わりに、この sed
を使用することもできます コマンド:
$ sed -e 's/_/,/g' -e 's/"//g' input.csv
1,1,0,0,76
1,1,0,0,77
1,1,0,0,78
コマンドラインテキスト処理の「スイスアーミーチェーンソー」であるPerlもこれを行うことができます。構文は (偶然ではありませんが) tr
によく似ています。 と sed
例:
perl -pe 'tr/_"/,/d' input.csv > result.csv
または:
perl -pe 's/_/,/g; s/"//g' input.csv > result.csv
しかし正直なところ、この基本的なタスクのためだけに新しいプログラミング言語 (awk、Perl、sed、およびそれらのような他のツールと同じです) を学ぶのに時間をかけたくない場合は、検索と置換をサポートする任意のテキスト エディター:
<オール>お気に入りのテキスト エディター (gedit、kate、マウスパッドなど。Windows の普通の古いメモ帳やワードパッドでもこれを行うことができます) で CSV ファイルを開きます。
メニューから [検索と置換] を選択します (別の [検索] メニューがない場合、通常は [編集] の下にあります)。
_
を入力してください 検索ボックスに、,
[すべて置換] をクリックします。
"
で繰り返します 検索ボックスにあり、置換ボックスには何もありません。
ファイルを保存します。
1 つだけではなく 100 または 1000 個のファイルに対してこれを行う必要がある場合は、新しいコマンドライン ツールを学習することが理にかなっています。もちろん、Perl や sed などの使い方を理解すれば、後で同様の作業を行うために多くの時間と労力を節約できます。ただし、二度と行う必要がないと思われる 1 回限りの作業の場合は、テキスト エディターのような基本的な対話型ツールが最も簡単な解決策になることがあります。