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


10

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

回答:


24

はるかに簡単な方法は使用することです tr

$ tr '_' ',' < input.csv | tr -d '"'                  
1,1,0,0,76
1,1,0,0,77
1,1,0,0,78

これが機能する方法は、tr2つの引数-置換される文字のセットとその置換- を取ることです。この場合、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

謝罪。逆コンマも削除したかった。質問を更新した
RKR

@RKR Answerはそれに応じて更新され、Ianの回答も更新されます
Sergiy Kolodyazhnyy 2017年

13

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

1
一重引用符内では、二重引用符をエスケープする必要はありません。
グレンジャックマン2017年

確かに@glennjackman!エスケープするバックスラッシュを削除しました
IanC 2017年

10

コマンドラインテキスト処理の「スイス軍チェーンソー」である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回限りのジョブの場合、テキストエディターなどの基本的な対話型ツールが最も簡単なソリューションになることがあります。


3

あなたもこれを行うことができます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ます。


2

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

awk -F "_" 'BEGIN { OFS="," }; {gsub(/\"/,""); print $1,$2,$3,$4,$5}' input.csv
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.