文件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
有了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"
(它假设值不包含|
,"
或换行符)。