GNU/Linux >> Linux の 問題 >  >> Linux

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

はるかに簡単な方法は、 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 回限りの作業の場合は、テキスト エディターのような基本的な対話型ツールが最も簡単な解決策になることがあります。


    Linux
    1. 二重引用符はいつ必要ですか?

    2. find と xargs を使用して rm でファイルを削除する

    3. 物理ドライブを取り外した後の vg と lv の削除

    1. シェルで引用をエスケープする方法は?

    2. 一重引用符やその他の特殊文字を含む文字列を印刷しますか?

    3. Linux でのファイルとディレクトリの作成と削除

    1. bash / 標準の Linux コマンドのみを使用して、文字列内の一重引用符と二重引用符を削除する

    2. AWK スクリプト出力のフィールドを二重引用符で囲みますか?

    3. 一重引用符と二重引用符の両方を含む bash エイリアス コマンド