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'[,"]' 但是我越来越多的列了.
帮助赞赏.
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)