쉼표를 세로 막대로 바꾸고(큰따옴표 제외) 큰따옴표를 제거합니다.

쉼표를 세로 막대로 바꾸고(큰따옴표 제외) 큰따옴표를 제거합니다.

파일 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

csvkitPython으로 작성된 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"

(값에 개행 문자가 포함되어 있지 않다고 가정합니다. |)"

관련 정보