3

このファイルをタブで区切っているとします。

This    is    a    cat,dog
I    run    around    the    house,garage

タブのすべてのインスタンスをコンマで置き換えたい(その部分は実行できます)が、すべての単語をコンマで囲んで引用符で囲みます。したがって、結果のファイルは次のようになります。

This,is,a,"cat,dog"
I,run,around,the,"house,garage"

どうすればこれを行うことができますか?

4

3 に答える 3

3

これを行う1つの方法は次のとおりです。

awk -v FS='\t' -v OFS=, '{$1=$1; for(i=1; i<=NF; i++) if($i ~ /,/) $i = "\"" $i "\"" } 1'

出力:

This,is,a,"cat,dog"
I,run,around,the,"house,garage"

説明:

  • OFS=,そして$1=$1awkにFSをOFSに置き換えさせます。
  • forループは各フィールドをチェックし、コンマが含まれている場合は二重引用符で囲みます。
  • 最後に、デフォルトの1ルールを呼び出します{ print $0 }

編集

スティーブは正しいです、この場合sedはより短いです。正規表現(steveから借用)を使用し、OFSとFS(GNU awkでテスト済み)の設定を追加することで、少し短くすることができます。

awk '{ $0 = gensub(/[^\t]*,[^\t]*/, "\"&\"", "g"); $1=$1 } 1' FS='\t' OFS=,
于 2012-12-12T23:47:40.403 に答える
1

awkおそらくこの仕事に適したツールではありません。私sedはより良い選択肢だと思います。これが私がすることです:

sed 's/[^\t]*,[^\t]*/"&"/g;s/\t/,/g' file
于 2012-12-13T00:22:45.713 に答える
1

sedとtrを使用して、単語間のスペースも処理します。

 sed 's/\([a-zA-Z]*[ ]*,[ ]*[a-zA-Z]*\)/"\1"/' input | tr '\t' ','
于 2012-12-13T00:10:51.887 に答える