CSVに二重引用符値の割り当てが保存されていますか?

CSVに二重引用符値の割り当てが保存されていますか?

次のテキストを含むファイルがあります。

dt=2016-06-30,path=path1,site=US,mobile=1
dt=2016-06-21,path=path2,site=UK,mobile=0

次のように、キーと値のペアに二重引用符の値を含むテキストに変換したいと思います。

dt="2016-06-30",path="path1",site="US",mobile="1"
dt="2016-06-21",path="path2",site="UK",mobile="0"

Sedまたは他のコマンドを使用して、各値を二重引用符の中にどのように入れることができますか?

答え1

使用

sed -e 's/=\([^,]*\)/="\1"/g' file.txt

使用アッ

awk -F, -v OFS=, '{for (f=1;f<=NF;f++) {sub(/=/,"&\"",$f); sub(/$/,"\"",$f)}; print}' file.txt

またはより短く:

awk -F, -v OFS=, '{for (f=1;f<=NF;f++) {gsub(/=|$/,"&\"",$f)} print}' file.txt 

またはより短く:

awk -F, -v OFS=, '{for (f=1;f<=NF;f++) {gsub(/=|$/,"&\"",$f)}} 1' file.txt 

使用前任者

Exはファイル用に設計されています。編集するただし、次のように実際にファイルに保存しなくても変更をプレビューできます。

ex -sc '%s/=\([^,]*\)/="\1"/g | %p | q!' file.txt 

実際に変更してファイルに保存するには、次を使用します。

ex -sc '%s/=\([^,]*\)/="\1"/g | x' file.txt

ただし、指定したパターンがファイルに見つからない場合(=ファイルのどこにも存在しない場合)、Exは自動的に終了しません。したがって、より堅牢性を高めるために、通常は次のようにprintfコマンドをExに渡します。

printf '%s\n' '%s/=\([^,]*\)/="\1"/g' %p | ex file.txt

変更を保存します。

printf '%s\n' '%s/=\([^,]*\)/="\1"/g' x | ex file.txt

答え2

そしてperl

$ # unlike sed/awk, newline is still part of input record
$ perl -pe 's/=\K[^,\n]*/"$&"/g' ip.txt 
dt="2016-06-30",path="path1",site="US",mobile="1"
dt="2016-06-21",path="path2",site="UK",mobile="0"

$ # or chomp newline and add it back while printing
$ perl -lpe 's/=\K[^,]+/"$&"/g' ip.txt
dt="2016-06-30",path="path1",site="US",mobile="1"
dt="2016-06-21",path="path2",site="UK",mobile="0"

答え3

awkを使う

awk '{gsub(/=/, "=\""); gsub(/,/,"\","); print $0"\""}' < file.txt

答え4

使用ミラー:

$ mlr put 'for (k,v in $*) {$[k] = "\"".v."\""}' mobile.dat
dt="2016-06-30",path="path1",site="US",mobile="1"
dt="2016-06-21",path="path2",site="UK",mobile="0"

関連情報