![当字段中包含分隔符时如何分隔列](https://linux22.com/image/180358/%E5%BD%93%E5%AD%97%E6%AE%B5%E4%B8%AD%E5%8C%85%E5%90%AB%E5%88%86%E9%9A%94%E7%AC%A6%E6%97%B6%E5%A6%82%E4%BD%95%E5%88%86%E9%9A%94%E5%88%97.png)
我有一个包含 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
如果您的要求是
- 如示例所示,所有数据都用双引号引起来
- 您对第一个和最后一个字段不感兴趣(或者准备做一些额外的工作来处理它们。
那么您可以将分隔符视为三个字符序列","
。
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