当字段中包含分隔符时如何分隔列

当字段中包含分隔符时如何分隔列

我有一个包含 24 个字段的 CSV 文件。该记录类似于下面的示例。所以有些字段的值中有“,”。如何使用分隔符?

我试图在第 9 列中查找大于 200 的值。但由于分隔符问题,我最终得到了前几列的文本。

"86680728811_10150499874478812","86680728811","fun ,celebrators.","New York City’s buildings, descend on Times Square when the iconic ball drops tomorrow...","abcnews.go.com","link","published_story","271","31","0","0","0","0","0","0","0","http://abcnews.go.com/blogs/headlines/2011/12/wishes-for-2012-to-fall-on-times-square/","https://external.xx.fbcdn.net/safe_image.php?d=AQAbTSWm1WlXInTf&w=130&h=130","2012-01-01 02:00:37"

我该如何解决这个问题?

答案1

您可能想要使用知道如何解析 CSV 的工具。以米勒为例:

mlr -N --csv filter '$9 > 200' < your-file

使用 GNU awk,您可以设置FPAT根据字段匹配的模式而不是分隔字段的分隔符来定义字段:

gawk -v 'FPAT=[^",]*|"([^"]|"")*"' 'substr($9,2) > 200'

这里也将转义处理""",但假设字段值不包含换行符,并且第 9 个字段始终嵌入引号中。

答案2

如果您的要求是

  1. 如示例所示,所有数据都用双引号引起来
  2. 您对第一个和最后一个字段不感兴趣(或者准备做一些额外的工作来处理它们。

那么您可以将分隔符视为三个字符序列","

awk -F '","' '$9>200 {print}' file.csv

(这{print}不是必需的,为了清楚起见,我将其放入以指示在何处添加其他代码)。

编辑:扩展示例,当第九个超过 200 时,以相同格式打印 3 列。

awk -F '","' 'BEGIN {OFS=FS}$9>200{print "\""$3,$8,$9"\""}'

将分隔符更改为|并按数字顺序排序。

awk -F '","' 'BEGIN {OFS="|"}$9>200{print $3,$8,$9}' | sort -d'|'-n -k3

相关内容