如何仅以逗号分隔的csv中的每一行从双引号内删除逗号?

时间:2019-01-24 18:32:30

标签: csv awk sed

我有一个逗号分隔的CSV文件,该文件将字段括在双引号中,而我试图在bash中对其进行操作。我想从每行的双引号字段中删除逗号。我已经针对此处提出的问题寻找了其他解决方案,它们围绕使用外部库进行CSV解析而展开,对于我的有限环境(大多数工作都是在awk和sed中完成),这不是我的选择。

"A","B","C D","E, F","G"

所需的输出

"A","B","C D","E F","G"

4 个答案:

答案 0 :(得分:1)

易于使用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中的所有单元格进行迭代并删除逗号。

答案 1 :(得分:0)

使用sed,可删除所有逗号后跟一个非引号字符和不带一个非引号字符的逗号:

sed 's/,*\([^"]\)/\1/g;s/\([^"]\),*/\1/g' file

编辑:

添加了*量词以匹配后续的逗号。

答案 2 :(得分:0)

使用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"

答案 3 :(得分:0)

我喜欢将Ruby用于CSV单行格式:

ruby -rcsv -ne '
  CSV.parse($_) {|row|
    puts row.map {|field| field.delete(",")}
            .to_csv(:force_quotes => true)
  }
'