web-dev-qa-db-ja.com

アンダースコアをカンマで置き換え、CSVで二重引用符を削除する

私は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
10
RKR

はるかに簡単な方法は、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
_
24

代わりに、次の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
13
IanC

コマンドラインテキスト処理の「スイス軍チェーンソー」であるPerlもこれを行うことができます。構文は(偶然ではありませんが)trおよびsedの例と非常によく似ています。

Perl -pe 'tr/_"/,/d' input.csv > result.csv

または:

Perl -pe 's/_/,/g; s/"//g' input.csv > result.csv

しかし正直なところ、この基本的なタスクだけのために時間をかけて新しいプログラミング言語(これはawk、Perlやsedなどのツールと同じです)を学びたくない場合は、検索と置換をサポートするテキストエディタ:

  1. お好みのテキストエディター(gedit、kate、マウスパッドなど)でCSVファイルを開きます。Windowsのプレーンな古いメモ帳やワードパッドでもこれを実行できます)。

  2. メニューから[検索と置換]を選択します(個別の[検索]メニューがない場合は、通常[編集]の下にあります)。

  3. 検索ボックスに_を、置換ボックスに,を入力します。

  4. 「すべて置換」をクリックします。

  5. 検索ボックスに"を繰り返し、置換ボックスには何も入力しません。

  6. ファイルを保存します。

さて、これを1つではなく100または1000ファイルに対して実行する必要がある場合は、新しいコマンドラインツールの学習が理にかなっています。そしてもちろん、Perlやsedなどの使い方を知っていれば、後で同様のタスクを実行して時間と労力を大幅に節約できます。ただし、再度実行する必要がないと思われる1回限りのジョブの場合、テキストエディターなどの基本的な対話型ツールが最も簡単なソリューションになることがあります。

10
Ilmari Karonen

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の内部にあります。

3
Questionmark

入力と出力のセパレータ値のデフォルト値を変更しないのはなぜですか

awk -F "_" 'BEGIN { OFS="," }; {gsub(/\"/,""); print $1,$2,$3,$4,$5}' input.csv
2
antuan sehikyan