다음과 같은 데이터가 포함된 파일이 있습니다.
“A”,”Dept1”,”i am mahesh,working in it”,”1”
“B”,”Dept2”,”i am suresh, working in non it”,”2”
내가 원하는 출력은 다음과 같습니다.
A,Dept1,i am mahesh~working in it,1
B,Dept2,i am suresh~working in non it,2
아래에서 시도했지만 다음과 같이 모두 ~ 로 대체됩니다.
awk -F ‘“,”’ -v OFS=‘’ ‘{for (i=0;i<=NF;++i) gsub(“,”,”~”,$i)}1’ file
“A”~”Dept1”~”i am mahesh~working in it”~”1”
“B”~”Dept2”~”i am suresh~working in non it”~”2”
답변1
구조화된 문서 형식으로 작업할 때는 범용 텍스트 처리 도구보다는 해당 특정 형식을 이해하는 도구를 사용하십시오.
CSV 파일에서 참조된 필드에는 "단순"이라고 알려지지 않은 경우를 제외하고 쉼표와 줄 바꿈이 포함될 수 있습니다. 인용된 필드의 인용 부호는 두 배로 표시됩니다( ""
).
포함된 쉼표를 물결표( ~
)로 변경하려면 다음과 같은 CSV를 지원하는 도구를 사용하는 것이 가장 좋습니다.MLR(밀러) 또는csvkit.
"
아래에서는 질문 텍스트에 사용한 큰 따옴표( )가 아닌 일반 큰따옴표( )를 인용 문자로 가정합니다 ”
.
mlr
이는 여러 가지 구조화된 형식을 인식하는 편리한 도구인 세 번째 필드를 변환하는 데 사용됩니다 .
$ mlr --csv -N put '$3=sub($3,",","~")' file
A,Dept1,i am mahesh~working in it,1
B,Dept2,i am suresh~ working in non it,2
이 --csv
옵션을 사용하면 mlr
CSV 데이터를 입력 및 출력하고 -N
데이터에 헤더가 없음을 유틸리티에 알립니다. 그런 다음 "동사"(동작)를 적용 put
하고 익숙하다면 친숙해 보일 표현을 제공합니다 awk
(인수의 순서 sub()
는 다르지만).
(csvkit에서)를 사용하면 csvformat
변경하려는 쉼표를 더 쉽게 찾을 수 있도록 데이터 형식을 다시 지정할 수 있습니다.
@
먼저 구분 기호를 (아직 데이터에 속하지 않은 모든 문자) 로 변경합니다 .
$ csvformat -D '@' file
A@Dept1@i am mahesh,working in it@1
B@Dept2@i am suresh, working in non it@2
tr
그런 다음 다음을 사용하여 나머지 쉼표를 물결표로 간단히 변경할 수 있습니다 .
$ csvformat -D '@' file | tr ',' '~'
A@Dept1@i am mahesh~working in it@1
B@Dept2@i am suresh~ working in non it@2
그런 다음 다음 명령을 다시 사용하여 구분 기호를 다시 쉼표로 전환합니다 csvformat
.
$ csvformat -D '@' file | tr ',' '~' | csvformat -d '@'
A,Dept1,i am mahesh~working in it,1
B,Dept2,i am suresh~ working in non it,2
이렇게 변경되니 참고하세요모두세 번째 열의 쉼표뿐만 아니라 물결표에도 쉼표를 삽입하세요.
결과를 새 이름으로 리디렉션하여 파일에 저장합니다.
답변2
sed
a) 큰따옴표 사이에 나타나는 쉼표를 물결표가 아닌 것으로 변경한 다음 b) 모든 큰따옴표를 제거해 보세요 .
sed 's/\([^"]\),\([^"]\)/\1~\2/g;s/"//g' infile
결과가 좋으면 -i
파일을 제자리에 교체하는 데 사용됩니다.
가정모두필드는 사용하기 전에 따옴표로 묶습니다.