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

jxn*_*jxn 1 regex linux csv bash awk

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

有时,在引用文本中也存在引用意味着像英寸之类的东西,从而产生更多的引用.

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

例如:

A,B,C
1,"hello, how are you",hello
2,car,bike
3,13.3 inch tv,"tv 13.3"""
Run Code Online (Sandbox Code Playgroud)

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

3
3
3
Run Code Online (Sandbox Code Playgroud)

我想过使用$awk -F'[,"]' 但是我越来越多的列了.

帮助赞赏.

Joh*_*024 9

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

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

这个怎么运作

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

有关更多详细信息,请参阅GNU手册.

处理嵌入引号内的引号

在问题的修订版中,我们有以下内容:

3,13.3 inch tv,"tv 13.3"""
Run Code Online (Sandbox Code Playgroud)

在这个扩展的情况下,双引号可以包含在双引号字段中,如果它们本身加倍的话.为了实现这一点,我们根据lcd047的建议扩展了正则表达式,允许在一个字段中允许任意数量的这样的双引号:

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