私はCSVファイルを持っています
input.csv
"1_1_0_0_76"
"1_1_0_0_77"
"1_1_0_0_78"
"1_1_0_0_79"
"1_1_0_0_80"
"1_1_0_0_81"
"1_1_0_0_82"
"1_1_0_0_83"
"1_1_0_0_84"
"1_1_0_0_85"
............. 等々。
このCSVファイルをに変換する必要があります
result.csv
1,1,0,0,76
1,1,0,0,77
1,1,0,0,78
1,1,0,0,79
1,1,0,0,80
1,1,0,0,81
1,1,0,0,82
1,1,0,0,83
1,1,0,0,84
1,1,0,0,85
はるかに簡単な方法は、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
_
代わりに、次の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、マウスパッドなど)でCSVファイルを開きます。Windowsのプレーンな古いメモ帳やワードパッドでもこれを実行できます)。
メニューから[検索と置換]を選択します(個別の[検索]メニューがない場合は、通常[編集]の下にあります)。
検索ボックスに_
を、置換ボックスに,
を入力します。
「すべて置換」をクリックします。
検索ボックスに"
を繰り返し、置換ボックスには何も入力しません。
ファイルを保存します。
さて、これを1つではなく100または1000ファイルに対して実行する必要がある場合は、新しいコマンドラインツールの学習が理にかなっています。そしてもちろん、Perlやsedなどの使い方を知っていれば、後で同様のタスクを実行して時間と労力を大幅に節約できます。ただし、再度実行する必要がないと思われる1回限りのジョブの場合、テキストエディターなどの基本的な対話型ツールが最も簡単なソリューションになることがあります。
vim
でもこれを行うことができます。
ファイルを開きます:vim input.csv
、次にvim
の高度な検索ツールs
を使用します。コロン(:
)コマンドモードに入り、次のようなコマンドを実行します。
:%s's/_/,/g' -- Replaces all occurrences of _ with , in the current file.
:s/\"//g -- Replaces all occurrences of " with nothing in the current file.
IanCの回答とほぼ同じコマンドですが、vim
を使用する代わりにsed
の内部にあります。
入力と出力のセパレータ値のデフォルト値を変更しないのはなぜですか
awk -F "_" 'BEGIN { OFS="," }; {gsub(/\"/,""); print $1,$2,$3,$4,$5}' input.csv