【问题标题】:How can I replace a comma character in a CSV ONLY when included between " "仅当包含在“”之间时,如何替换 CSV 中的逗号字符
【发布时间】:2016-12-11 06:36:00
【问题描述】:

我有一个包含单词和数量的 csv 文件。当金额 > 999 时,数字包含在“”中,以便区分用作千位分隔符的逗号字符和用作字段分隔符的逗号,如下所示:

black, "1,340.00", brown, white, 150.00, blue
apple, 10.00, bread, coffee, "1,850.00", juice
cat, dog, 995.00, tiger, "2,450.00"

我希望仅删除包含在“”之间的逗号,留下其他逗号(字段分隔符),并删除“”。 新 csv 的输出应该是这样的:

black, 1340.00, brown, white, 150.00, blue 
apple, 10.00, bread, coffee, 1850.00, juice 
cat, dog, 995.00, tiger, 2450.00

我玩过 sed 和 awk,但我不确定实现它的最佳方法。 谢谢!

【问题讨论】:

    标签: linux bash awk sed centos


    【解决方案1】:
    $ awk -F\" '{for (i=2; i<=NF; i+=2) gsub(/,/,"",$i)} 1' OFS="" input.csv
    black, 1340.00, brown, white, 150.00, blue
    apple, 10.00, bread, coffee, 1850.00, juice
    cat, dog, 995.00, tiger, 2450.00
    

    工作原理

    • -F\"

      这告诉 awk 使用双引号作为字段分隔符。

    • for (i=2; i&lt;=NF; i=i+2) gsub(/,/,"",$i)

      每个偶数字段都是双引号中的字段。对于偶数字段,我们删除逗号。

      这只是因为我们选择了" 作为字段分隔符。

    • 1

      这是 awk 对 print-the-line 的神秘简写。

    • OFS=""

      这告诉 awk 使用空字符串作为输出的字段分隔符。这具有删除引号的效果。

    【讨论】:

    • 干得好;以防万一有人和我最初有同样的误解:尽管只针对 even 索引字段,但这个解决方案实际上 is 与列无关,因为"(而不是,) 用作字段分隔符。
    • 是的,虽然我更希望在使用 OFS 之前在脚本前面看到 OFS 初始化代码 (awk -v OFS= 'script'),但也得到了我的支持,而不是在它的后面使用 OFS 后 (awk 'script' OFS="")。
    • MarcoFalzone,很高兴它对你有用。 @EdMorton,你的回答也有我的 +1。
    【解决方案2】:
    $ sed -E 's/"([^"]+),([^"]+)"/\1\2/g' file
    black, 1340.00, brown, white, 150.00, blue
    apple, 10.00, bread, coffee, 1850.00, juice
    cat, dog, 995.00, tiger, 2450.00
    

    以上仅适用于999,999.99 下的金额(如输入/输出示例所示),因为它只能从每个数字中删除一个逗号。

    这适用于任何数字:

    awk '{while ( match($0,/([^"]*)("[^"]+")(.*)/,a) ) { gsub(/[",]/,"",a[2]); $0 = a[1] a[2] a[3] } }1' file
    

    上面使用 GNU awk 作为第三个参数来 match(),而其他 awk 则使用 3 次调用 substr()。

    @John1024's answer 是更明智、更简洁的方法,如果您可以在一个字段中使用多个逗号。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-12-02
      • 2011-10-13
      • 1970-01-01
      • 2021-09-29
      • 1970-01-01
      • 1970-01-01
      • 2019-04-18
      相关资源
      最近更新 更多