2016-09-13 13 views
0

私はタブで区切られたファイルを扱っていて、列#1の周りに引用符を追加しようとしていて、文字列に引用符がある場合は引用符を追加します(エスケープとして)。ここでawk addファイルの引用符の列

は、ファイルの先頭である:

auto_type compact 323 
auto_type truck 219 
auto_type truck 5" 25 

望ましい結果:ここで

auto_type "compact" 323 
auto_type "truck" 219 
auto_type "truck 5"" 25 

は、少なくとも列の前後に引用符を追加することで私の最初の試みである:

awk -F, '{print gsub("\"","\"\"",$2)}' OFS=, vehicle_file.txt 
+0

なぜこれが欲しいですか?あなたの望む出力は、私の改善のようには見えず、実際はあいまいです。リテラルな二重引用符をダブルクォートされたフィールドに二重に埋め込むことを可能にするCSV方言がありますが、ここではそうしていません(また、あなたの値にタブがない場合、あなたも最初にこれが必要ですか?) – tripleee

+0

本当に望む結果が望みですか?通常、二重引用符がデータの一部であることを示すために、 "トラック5" ""(3つの連続する二重引用符)が必要です。あなたが言うことは、データに二重引用符があるという事実を無視すれば、あなたが得るものと同じです。 –

+0

連続した引用符が不思議ですが、データロードの要件に応じて必要です。 – jKraut

答えて

1
$ awk 'BEGIN{FS=OFS="\t"} {gsub(FS,"\""FS); sub(/\"\t/,FS"\"",$0); print $0}' foo 
auto_type  "compact"  323 
auto_type  "truck" 219 
auto_type  "truck 5""  25 
    それは比類のない二重引用符を使用して第二のフィールドを離れると
  • が最初にあなたの所望の出力が間違っている、その後FS"
2

で最初"FSを置き換える"FS

  • ですべてFSを置き換え、それは次のようになります。

    $ awk 'BEGIN{FS=OFS="\t"} {gsub(/"/,"\"\"",$2); $2="\"" $2 "\""} 1' file 
    auto_type  "compact"  323 
    auto_type  "truck" 219 
    auto_type  "truck 5"""  25 
    
  • 0

    データ内の引用符を二重にする必要がある場合は、引用符をフィールドの前に追加する前にそれを行います。したがって:

    $ awk -F'\t' 'BEGIN { OFS=FS } { gsub(/"/, "\"\"", $2); $2 = "\"" $2 "\""; print }' data | 
    > pr -e16 -l1 -t 
    auto_type  "compact"  323 
    auto_type  "truck"   219 
    auto_type  "truck 5"""  25 
    $ 
    

    (。prためにコマンドが-e16の16個のタブを空白に展開し、それを見て、それらが容易になり、かつデータを整列)

    ご質問のような出力をしたい場合は、 gsubを省略:

    $ awk -F'\t' 'BEGIN { OFS=FS } { $2 = "\"" $2 "\""; print }' data | pr -l1 -t -e16 
    auto_type  "compact"  323 
    auto_type  "truck"   219 
    auto_type  "truck 5""  25 
    $ 
    

    しかし、この出力は、私の知っている任意のCSVリーダーのための使用可能なデータファイルではありません。

    +0

    awkはコマンドラインで変数に代入されたときに ''\ t''を解釈します(' -F'で 'FS'を設定する場合を含む)。タブ文字、バッシュ表現 '-F $ '\ t''やリテラル' -F'• ''を必要とせず、単に' -F' \ t''が行います。 –

    +1

    @EdMorton:それはBSD(Mac OS X)とGNU版の 'sed'の両方で動作するようですので、私は答えを更新しました - ありがとうございます。私は、POSIX ['awk'](http://pubs.opengroup.org/onlinepubs/9699919799/utilities/awk.html)の仕様はあまりにも曖昧だと思う。それは確かにいくつかの文脈ではタブを表す '\ t'について議論しているので、ここでもそれを適用することが一貫している(そしてスクリプティングを簡略化する)が、FSの評価にテキストが当てはまるとは思わなかった。 –

    +0

    あなたは実際にタブとして解釈されたくない場合(そして余分なエスケープを加えることはできないと仮定して)、実際にいくつかのフープを飛ばしなければなりません。'fs = '\ t' awk 'BEGIN {FS = ENVIRON [" fs "]; printf "<%s> \ n"、FS} 'または' awk 'BEGIN {FS = ARGV [1]; ARGV [1] = ""; printf "<%s> \ n"、FS} "\ t"です。基本的にawkはシェルの 'read'がデフォルトで行うように、コマンドライン変数の設定でバックスラッシュを解釈します。 –

    0
    awk '{sub($2, "\"&\"")sub(/truck\42 5/,"truck 5\42")}1' file 
    
    auto_type "compact" 323 
    auto_type "truck" 219 
    auto_type "truck 5"" 25 
    
    関連する問題