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 解析模块的高级脚本语言。