【问题标题】:Split string on commas but ignore commas within double-quotes using shell scripting in a .csv file?使用 .csv 文件中的 shell 脚本在逗号上拆分字符串但忽略双引号内的逗号?
【发布时间】:2017-01-19 01:25:15
【问题描述】:

示例“null.csv”文件包含

71131940,2015-05-01,"JEWELLERY,ITEM",P,,W

我有一个 .csv 文件,我想在其中处理逗号 (,) 和空值 (,,),这样当我使用 (,) 分割文件的每一行时,它会忽略双引号内的逗号并且不会给出如下所示的输出。

71131940,2015-05-01,JEWELLERY,ITEM,P,,W

我处理空值,即 (,,) 通过使用 sed 命令将其替换为 (,0,)

sed -i -e "s/,,/,0,/g" null.csv

得到类似的输出

71131940,2015-05-01,JEWELLERY,ITEM,P,0,W

但问题是,在这里我不想将“JEWELLERY,ITEM”拆分为 珠宝,物品。

我们将不胜感激。

【问题讨论】:

  • 如果您需要遵守所有关于引用和转义的规则,CSV 解析会很痛苦。如果您可以将 python 用于您的解决方案,它会变得更容易。例如python -c 'import csv;print "\n".join(list("\t".join(row) for row in list(csv.reader(open("null.csv")))))'
  • Eric 感谢您的快速回复,但我正在寻找可以让我这样做的 shell 脚本。
  • 我一直想知道是谁提出了“使用 shell 脚本编辑 CSV、JSON 或 XML”之类的要求。不过不管怎样,this这个小程序可以帮助你实现你的梦想,如果把它加到图片中不违反要求,那就是。
  • @SatoKatsura 非常感谢。它确实帮了我很多忙!甚至没想到会看到这样的解决方案,并且由于自述文件中所述的确切原因而使我头疼了好几个小时。

标签: shell csv awk sed


【解决方案1】:

我确信这已经被问和回答了一百万次,但无论如何,输入格式与您显示的一样简单(例如,引号内没有引号或换行符):

$ awk -v FPAT='[^,]*|"[^"]*"' '{for (i=1;i<=NF;i++) print i, $i}' file
1 71131940
2 2015-05-01
3 "JEWELLERY,ITEM"
4 P
5
6 W

以上使用 GNU awk 表示 FPAT(参见 https://www.gnu.org/software/gawk/manual/gawk.html#Splitting-By-Content)。

【讨论】:

    猜你喜欢
    • 2011-12-25
    • 2020-08-03
    • 1970-01-01
    • 2020-04-05
    • 2012-07-12
    • 1970-01-01
    相关资源
    最近更新 更多