我有一个逗号分隔的 CSV 文件,它用双引号封装了我试图在 bash 中操作的字段。我想从每行的双引号字段中删除逗号。对于此处提出的问题,我查看了其他解决方案,它们围绕使用外部库进行 CSV 解析,这对于我的大部分工作都是在 awk 和 sed 中完成的有限环境来说不是一个选项。
"A","B","C D","E, F","G"
期望的输出
"A","B","C D","E F","G"
使用 sed,删除所有后跟一个非引号字符的逗号和前面不是一个非引号字符的逗号:
sed 's/,*\([^"]\)/\1/g;s/\([^"]\),*/\1/g' file
编辑:
添加*量词以匹配后续逗号。
使用 Perl 的Text::CSV_XS模块很容易:
perl -MText::CSV_XS=csv -we 'csv(
in => shift,
always_quote => 1,
on_in => sub { tr/,//d for @{ $_[1] } }
);' -- file.csv
in指定输入,shift只从命令行参数中取一个always_quote甚至为不需要它们的字段添加引号on_in引入在每一行上运行的代码,在这种情况下,它遍历行中的所有单元格并使用音译运算符删除逗号tr。使用 GNU awk 和FPAT:
$ awk '
BEGIN {
FPAT = "([^,]+)|(\"[^\"]+\")" # field definition
OFS="," # output field separator
}
{
for(i=1;i<=NF;i++) # loop all fields
gsub(/,/,"",$i)} # replace all commas in fields
1' file # output
"A","B","C D","E F","G"
我喜欢 Ruby 用于 CSV 单行:
ruby -rcsv -ne '
CSV.parse($_) {|row|
puts row.map {|field| field.delete(",")}
.to_csv(:force_quotes => true)
}
'