gpt4 book ai didi

regex - AWK 为逗号和引号设置多个分隔符

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:14:44 25 4
gpt4 key购买 nike

我有一个 CSV 文件,其中的列以逗号分隔,并且包含带有逗号的文本数据的列被引用。

有时,在引用的文本中也存在引号来表示诸如英寸之类的东西,从而导致更多的引号。

没有嵌入逗号的文本数据没有引号。

例如:

A,B,C
1,"hello, how are you",hello
2,car,bike
3,13.3 inch tv,"tv 13.3"""

我如何使用 awk 打印我应该得到的每一行的列数

3
3
3

我想过使用 $awk -F'[,"]' 但我得到的列比现在多得多。

感谢帮助。

最佳答案

GNU awk 有一个扩展来处理这种有问题的 CSV 文件。让我们先考虑这个,不在引号中嵌入引号:

$ awk -v FPAT="([^,]+)|(\"[^\"]+\")" '{print NF}' file.csv
3
3
3

工作原理

不是通过分隔符定义字段,FPAT 允许我们通过正则表达式定义字段。在这种情况下,我们将字段定义为没有逗号的内容 ([^,]+),或者用双引号括起来的内容 (\"[^\"]+\").

有关详细信息,请参阅 the GNU manual .

处理引号中嵌入的引号

在问题的修订版中,我们有一行:

3,13.3 inch tv,"tv 13.3"""

在这种扩展情况下,如果双引号本身加倍,则可以将双引号包含在双引号字段中。为此,我们根据 lcd047 的建议扩展了正则表达式,以允许在一个字段中使用任意数量的此类双引号:

 awk -v FPAT="([^,]+)|(\"([^\"]|\"\")+\")"  '{print NF}' file.csv

关于regex - AWK 为逗号和引号设置多个分隔符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31083953/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com