CSV 형식의 입력 파일이 있습니다. 일부 필드는 쉼표와 함께 큰따옴표로 묶여 있습니다. 샘플라인입니다
123,"ABC, DEV 23",345,534.202,NAME
a 의 큰따옴표 안에 표시되지 않는 모든 쉼표를 제거해야 하므로 ~
출력은 다음과 같아야 합니다.
123~"ABC, DEV 23"~345~534.202~NAME
나는 이것을 시도했지만 나에게 반대 결과를 제공합니다.
awk -F '"' -v OFS='' '{ for (i=0; i<= NF; ++i) gsub(",","~",$i) } 1' test.txt
123,ABC~ DEV 23,345,534.202,NAME
답변1
,
기본적으로 구분 기호를 에서 으로 바꾸려는 CSV 파일이 있습니다 ~
.
사용csvkit
:
$ csvformat -D '~' file.csv >newfile.csv
$ cat newfile.csv
123~ABC, DEV 23~345~534.202~NAME
cvsformat
불필요한 따옴표를 제거하십시오. 도착하다다음에 추가인용 부호:
$ csvformat -U 1 -D '~' file.csv
"123"~"ABC, DEV 23"~"345"~"534.202"~"NAME"
이용정보를 확인하세요 csvformat --help
.
사용밀러( mlr
) 대신에:
$ mlr --csv -N --ofs '~' cat file.csv
123~ABC, DEV 23~345~534.202~NAME
더 이상 필요하지 않더라도 원래 인용문을 유지하십시오.
$ mlr --csv -N --ofs '~' --quote-original cat file.csv
123~"ABC, DEV 23"~345~534.202~NAME
두 명령 모두에서 이 -N
옵션은 입력에 헤더가 없고 출력에도 헤더가 없어야 한다는 사실을 나타내는 데 사용됩니다. 이 --ofs
옵션은 출력 필드 구분 기호를 설정합니다.
답변2
암소 비슷한 일종의 영양awk
해결책:
awk -v FPAT='[^,]+|"[^"]+"' '{ for(i=1;i<=NF;i++) printf "%s%s",$i,(i<NF? "~" : ORS) }' file
FPAT='[^,]+|"[^"]+"'
- 각 필드를 설명하는 정규식 패턴은 다음과 같습니다."쉼표가 아닌 모든 것"또는"큰 따옴표, 큰 따옴표가 아닌 모든 것 및 닫는 큰 따옴표."
산출:
123~"ABC, DEV 23"~345~534.202~NAME
답변3
이것을 시도해 볼 수 있습니다.
awk 'NR%2==1{gsub(",","~")}1' RS='"' ORS='"' infile
답변4
위의 예에서는 다음 두 가지 방법으로 수행했습니다. 테스트됨
방법 1
for (( i=1;i<6;i++)); do awk -F "," -v i="$i" '$i ~ /"/{gsub(" ",",",$2);print }' inputfile;done| tail -1| sed 's/,/~/3g'| sed 's/,/~/1'
산출
123~"ABC, DEV 23"~345~534.202~NAME'
방법 2
sed "s/,/~/3g" inputfile| sed 's/,/~/1'
산출
123~"ABC, DEV 23"~345~534.202~NAME'