我有一个逗号分隔的文件,如下所示:
123,456,"ABC,DEF"
我想将文件更改为分号分隔的文件:
123;456;"ABC,DEF"
我运行了以下命令,但不幸的是引号中的 , 也更改为 ;。我怎样才能阻止这种情况发生?
sed 's/,/;/g; s/\"//g; s/$/;^/' input.csv > output.csv
答案1
如何从逗号分隔更改为分号分隔,但不更改引号之间的逗号?
您可以使用csvtool
。它已经针对许多发行版进行了打包。使用正则表达式处理 csv 格式既困难又容易出错。
$ csvtool -t ',' -u ';' col 1- input.csv > output.csv
答案2
您可以使用awk
双引号作为字段分隔符,并仅替换,
奇数;
字段(1、3、5 等)。
awk 'BEGIN{OFS=FS="\""} {for (i=1;i<=NF;i=i+2) gsub(/,/,";",$i)}1' file
这里做了一些假设,比如最初没有;
进入字段,"
双引号内没有嵌入/转义,但输入很简单,如示例中所示。
为了处理更复杂的情况,GNU awk 提供了一个FPAT
解决方案对于 csv 文件,这在大多数情况下都很有效,但不包括字段中的换行符等情况。如果这个 cvs 不能像示例中那样简单,那么需要一个使用 cvs 解析库的程序。
答案3
使用 GNU awk 进行 FPAT:
$ awk -v FPAT='[^,]*|"[^"]+"' -v OFS=';' '{$1=$1}1' file
123;456;"ABC,DEF"