更改 CSV 文件中的分隔符

更改 CSV 文件中的分隔符

我有一个 CSV 格式的输入文件。有些字段用双引号引起来,其中有逗号。这是示例行

123,"ABC, DEV 23",345,534.202,NAME

我需要删除 a 的双引号内未出现的所有逗号~,因此输出应如下所示:

123~"ABC, DEV 23"~345~534.202~NAME

我已经尝试过这个,但它给了我相反的输出:

awk -F '"' -v OFS='' '{ for (i=0; i<= NF; ++i) gsub(",","~",$i) } 1' test.txt
123,ABC~ DEV 23,345,534.202,NAME

答案1

您基本上有一个 CSV 文件,您想要替换其中的分隔符 from,~

使用csvkit:

$ csvformat -D '~' file.csv >newfile.csv

$ cat newfile.csv
123~ABC, DEV 23~345~534.202~NAME

cvsformat删除不需要的引号。到添加引号:

$ csvformat -U 1 -D '~' file.csv
"123"~"ABC, DEV 23"~"345"~"534.202"~"NAME"

请参阅csvformat --help使用信息。


使用磨坊主mlr) 反而:

$ mlr --csv -N --ofs '~' cat file.csv
123~ABC, DEV 23~345~534.202~NAME

保留原始报价,即使不再需要它们:

$ mlr --csv -N --ofs '~' --quote-original cat file.csv
123~"ABC, DEV 23"~345~534.202~NAME

在这两个命令中,该-N选项用于表示输入没有标头并且输出也不应该有标头这一事实。该--ofs选项设置输出字段分隔符。

答案2

GNUawk解决方案:

awk -v FPAT='[^,]+|"[^"]+"' '{ for(i=1;i<=NF;i++) printf "%s%s",$i,(i<NF? "~" : ORS) }' file
  • FPAT='[^,]+|"[^"]+"'- 描述每个字段的正则表达式模式是“任何不是逗号的东西”或者“双引号,任何不是双引号的内容,以及结束双引号。”

输出:

123~"ABC, DEV 23"~345~534.202~NAME

答案3

你可以试试这个 awk

awk 'NR%2==1{gsub(",","~")}1' RS='"' ORS='"' infile

答案4

对于上面的例子,我已经通过以下两种方法完成了。已测试

方法1

for (( i=1;i<6;i++)); do awk -F "," -v i="$i" '$i ~ /"/{gsub(" ",",",$2);print }' inputfile;done| tail -1| sed 's/,/~/3g'| sed 's/,/~/1'

输出

123~"ABC, DEV 23"~345~534.202~NAME'

方法2

 sed "s/,/~/3g" inputfile| sed 's/,/~/1'

输出

123~"ABC, DEV 23"~345~534.202~NAME'

相关内容