구분 기호가 있는 파일이 있습니다 ;
. 내 응용 프로그램은 이러한 구분 기호를 기반으로 데이터를 구문 분석합니다. 문자열 필드는 열 사이 ""
와 열 내에 있으며 텍스트로 구분 기호를 사용할 수 있습니다. 해당 파일의 구분 기호를 바꾸고 싶습니다(예: 로 변경 |
) ""
. 예는 다음과 같습니다.
입력하다:
"BARCELONA";"";"Country.666;53;98";15;19;"test";4343;63647;655848
산출
"BARCELONA"|""|"Country.666;53;98"|15|19|"test"|4343|63647|655848
답변1
정확한 출력을 얻으려면,
$ perl -MText::CSV -lpe '
BEGIN{$p = Text::CSV->new({sep_char => ";"})}
$_ = join "|", map { /^\d+$/ ? $_ : qq("$_") } $p->fields() if $p->parse($_)
' INPUT
"BARCELONA"|""|"Country.666;53;98"|15|19|"test"|4343|63647|655848
틀에 얽매이지 않는 언급을 고집하지 않는다면,
$ csvformat -d';' -D'|' INPUT
BARCELONA||Country.666;53;98|15|19|test|4343|63647|655848
숫자가 아닌 값을 참조하도록 입력 및 출력을 강제합니다.거의원하는 방식으로 작동하지만 분명히 숫자 필드를 부동 소수점으로 승격합니다.
$ csvformat -d';' -u2 -D'|' -U2 INPUT
"BARCELONA"|""|"Country.666;53;98"|15.0|19.0|"test"|4343.0|63647.0|655848.0
답변2
현장에서 데이터를 변경하는 것은 안전하지 않습니다.
csv 파일을 구문 분석하려면 다음을 사용할 수 있습니다.csvtool
$ echo '"BARCELONA";"";"Country.666;53";15' | csvtool -t ';' col 1- -
BARCELONA,,Country.666;53,15
또는 특정 지역을 타겟팅
$ echo '"BARCELONA";"";"Country.666;53";15' | csvtool -t ';' col 1,3 -
BARCELONA,Country.666;53
답변3
이렇게 하면 쉬울 거라 생각했는데 awk
, 결국 좀 혼란스러웠습니다. 그러나 이 문제로 어려움을 겪고 있으므로 awk
해당 기능을 활용하는 FPAT
잠재적인 솔루션은 다음과 같습니다.
cat file.txt | awk -v FPAT='[^;]+|"[^"]+"' '{ for( col=1; col<=NF; col++ ) { printf "%s|", $col; } print "" }'
FPAT
기본적으로 정규식을 사용하여 항목으로 분류되는 항목을 정의하고(세미콜론이나 따옴표 없이) |
열 사이에 ( ) 문자를 사용하여 다시 인쇄합니다. 원래는 해당 OFS
옵션을 사용하려고 했으나 FPAT
잘 작동하지 않는 것 같습니다 .
답변4
GNU sed
확장 정규식이 활성화된 편집기를 사용하여 이 작업을 수행 할 수 있습니다 .
$ sed -Ee 's/(("[^"]*")+|[^;]+);/\1|/g' in.csv