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"

관련 정보