아래와 같은 값의 예가 포함된 CSV 파일이 있습니다.
"Basic","""21,21""","[""21"",""21""]","","","","",""
2 및 3과 같은 일부 열에서 추가 큰따옴표를 제거해야 합니다.
예상 출력은 다음과 같습니다
"Basic","21,21","[21,21]","","","","",""
awk, sed 또는 기타 Linux 도구를 사용하여 이를 어떻게 달성할 수 있습니까?
아래에 더 많은 파일 예가 언급되어 있으며, 이 열의 값은 항상 []에 있으며, [] 안의 따옴표를 제거해야 합니다.
"Basic","""40""","[""40""]","""13F""","[""13F""]","",""
"Basic","""0""","[""0""]","","","""MCOMB""","[""MCOMB""]"
답변1
답변2
답변3
sed
해결책이 있어요
sed -e 's/,"""/,"/g' -e 's/""",/",/g' -e 's/\([^,]\)""/\1/g' -e 's/""\([^,]\)/\1/'
이것은 만든다
"Basic","40","[40]","13F","[13F]","",""
"Basic","0","[0]","","","MCOMB","[MCOMB]"
"Basic","21,21","[21,21]","","","","",""
sed 명령은 매우 간단합니다.
's/,"""/,"/g'
다음 항목을 모두,"""
바꿉니다 .,"
g
's/\([^,]\)""/\1/g'
쉼표가 아닌 문자[^,]
와 두 개의"
기억된 문자를 찾아\( \)
기억된 문자로 바꿉니다.\1
줄 끝의 후행 공백은 마지막 공백을 제거합니다.""
@cas가 지적했듯이 csv 도구를 사용하면 장기적으로 더 나을 것입니다.
답변4
데이터에서 모든 큰따옴표, 즉 CSV 형식의 큰따옴표와 포함된 따옴표, 쉼표 및 개행을 인용하는 데 필요한 큰따옴표가 아닌 모든 큰따옴표를 제거한다고 가정합니다.
csvformat
csvkit을 사용하여 tr
각 필드에 대한 내부 참조를 제거합니다.
$ cat file
"Basic","""40""","[""40""]","""13F""","[""13F""]","",""
"Basic","""0""","[""0""]","","","""MCOMB""","[""MCOMB""]"
"Basic","""21,21""","[""21"",""21""]","","","","",""
$ csvformat -Q "'" file | tr -d '"' | csvformat -q "'"
Basic,40,[40],13F,[13F],,
Basic,0,[0],,,MCOMB,[MCOMB]
Basic,"21,21","[21,21]",,,,,
위 파이프라인은 먼저 CSV 파일에 사용된 따옴표 문자를 큰따옴표에서 작은따옴표로 변경합니다. 이 tr
명령은 나머지 큰따옴표(부분 데이터)를 모두 제거합니다. 마지막 csvformat
명령은 데이터를 큰따옴표를 사용하여 다시 변환합니다.
빈 필드를 포함하여 모든 필드를 참조해야 하는 경우 의 두 번째 호출에 추가 -U 1
하세요 csvformat
. 기본적으로 csvkit 유틸리티는 필요한 필드에 대해서만 따옴표를 출력합니다.