파일 1
12584,"Capital of America, Inc.",,HORIZONCAPITAL,USA,......etc
25841,"Capital of America, Inc.",,HORIZONCAPITAL,USA,......etc
87455,"Capital of America, Inc.",,HORIZONCAPITAL,USA,......etc
산출
12584|Capital of America, Inc.||HORIZONCAPITAL|USA|......etc
25841|Capital of America, Inc.||HORIZONCAPITAL|USA|......etc
87455|Capital of America, Inc.||HORIZONCAPITAL|USA|......etc
csv 파일이 있는데 파이프(|)로 구분된 텍스트 파일로 변환해야 합니다. 쉘 스크립트를 완료했습니다.sed 's/^/"/;s/,/|/g;s/$/"/' $File > $Output
그런데 문제는 'US Capital Corporation' 분야이다. 쉼표가 포함되어 있으며 파이프(|)로 대체됩니다. 그래서 나는 모든 것을 파이프로 바꾸고 싶지만 값 안에 큰 따옴표 ""를 제공하지 않습니다.
이를 수행할 수 있는 쉘 스크립트가 있습니까?
답변1
사용csvkit
:
$ csvformat -D '|' file.csv
12584|Capital of America, Inc.||HORIZONCAPITAL|USA|......etc
25841|Capital of America, Inc.||HORIZONCAPITAL|USA|......etc
87455|Capital of America, Inc.||HORIZONCAPITAL|USA|......etc
csvkit
Python으로 작성된 CSV 조작/쿼리 도구 모음입니다. 올바른 CSV 구문 분석이 가능하며 csvformat
기본 쉼표 구분 기호를 다른 문자로 바꾸는 데 사용할 수 있습니다. 이 유틸리티는 결과가 CSV 규칙에 따라 올바르게 인용되는지 확인합니다.
답변2
최소한 Debian 기반 시스템에서는 OCaml 기반을 설치할 수 있어야 합니다.csvtool
$ csvtool -u '|' cat file.csv
12584|Capital of America, Inc.||HORIZONCAPITAL|USA|......etc
25841|Capital of America, Inc.||HORIZONCAPITAL|USA|......etc
87455|Capital of America, Inc.||HORIZONCAPITAL|USA|......etc
Perl 모듈을 사용할 수도 있습니다 Text::CSV
.
$ perl -MText::CSV -lne '
BEGIN{$p = Text::CSV->new()}
print join "|", $p->fields() if $p->parse($_)
' file.csv
12584|Capital of America, Inc.||HORIZONCAPITAL|USA|......etc
25841|Capital of America, Inc.||HORIZONCAPITAL|USA|......etc
87455|Capital of America, Inc.||HORIZONCAPITAL|USA|......etc
답변3
문제를 해결하려면:
awk 'BEGIN{FS=",";OFS="|";} {print $1,$2","$3,$4,$5,$6,$7}' Test | tr -d \"
이와 같은 일반적인 질문에 대해 GNU awk
에는FPAT필드를 설명하는 특수 변수:
awk -vFPAT='[^,]*|("[^"]*")' -vOFS='|' '{$1=$1;print}' Test | tr -d \"
12584|Capital of America, Inc.||HORIZONCAPITAL|USA|......etc
25841|Capital of America, Inc.||HORIZONCAPITAL|USA|......etc
87455|Capital of America, Inc.||HORIZONCAPITAL|USA|......etc
awk
및 도구를 사용하면 sed
추가 소프트웨어 패키지가 필요하지 않습니다.
편집하다
~처럼이삭언급했듯이 답변을 업데이트합니다.
awk -vFPAT='[^,]*|(["].*["])' -vOFS='|' '{print $1,$2,$3,$4,$5,$6}' Test | sed 's/\"//g'
답변4
독립성 perl
:
perl -pe 's{"(.*?)"|,}{$1 // "|"}ge' < "$File" > "$Output"
(값에 개행 문자가 포함되어 있지 않다고 가정합니다. |
)"