当字段包含逗号时,如何使用命令“cut”剪切CSV文件中的字段?

当字段包含逗号时,如何使用命令“cut”剪切CSV文件中的字段?

CSV 文件格式数据如下

"Pizza,wings,icecream","hopper","0",,"Masdfasdf","USA","381","10 AM","cap",,,"monster"

使用逗号作为分隔符(如下所示)将导致带有逗号的字段被计为分隔符,这不是我想要的。

cat /path/to/file | cut -d , -f2

将返回

wings

当我想要的时候

hopper

我想我已经找到了逻辑上的解决方案,但我不确定如何实施它。

我如何制作一个分隔符来表示“如果我是一个逗号,被另一个逗号或引号包围,则将我算作分隔符”?


例子

[tksmith@rifle ~]$ cat deleteme 

"Pizza,wings,icecream","hopper","0",,"Masdfasdf","USA","381","10 AM","cap",,,"monster"

[tksmith@rifle ~]$ cat deleteme | cut -d , -f2

wings

答案1

CSV 格式有足够多的边缘情况,您不想重新解析它。使用正确的 CSV 解析器。例如,使用红宝石

ruby -rcsv -e 'CSV.foreach(ARGV.shift) {|row| puts row[1]}' file

答案2

cut 命令一次仅定界一个字符。因此,您可以使用 sed 和正则表达式将引号和逗号转换为另一个单字符分隔符。例如:

sed -e 's/","\|",\|,"\|,,/@/g' /path/to/file | cut -d@ -f2

将返回

hopper

另一种方法是使用 AWK。例如,以下内容将为您提供第二个字段。

awk -F ',,|^"|","|",|,"|"$' '{print $3}' /path/to/file

将返回

hopper

上面的示例并不完美,因为它们无法正确处理具有多个空字段和外部引号的所有情况。最好使用带有 CSV 解析模块的高级脚本语言。

相关内容