将逗号替换为竖线 |(双引号内除外),并删除双引号

将逗号替换为竖线 |(双引号内除外),并删除双引号

文件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 文件,我必须将其转换为用管道(|)分隔的文本文件我已经完成了 shell 脚本sed 's/^/"/;s/,/|/g;s/$/"/' $File > $Output

但问题是“美国资本公司”字段。包含逗号,也由竖线 (|) 替换。所以我只想用管道替换所有内容,但不在值内给出双引号“”。

有没有shell脚本可以做到这一点?

答案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 \"

对于像这样的一般性问题,GNUawk有一个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

有了awksed工具,您不需要额外的软件包。 编辑 作为伊萨克提到过,我更新我的答案:

awk -vFPAT='[^,]*|(["].*["])' -vOFS='|' '{print $1,$2,$3,$4,$5,$6}' Test | sed 's/\"//g'

答案4

与独立perl

perl -pe 's{"(.*?)"|,}{$1 // "|"}ge' < "$File" > "$Output"

(它假设值不包含|,"或换行符)。

相关内容