如何从Shell脚本中的.csv文件的列中读取多个值

时间:2020-09-23 06:35:47

标签: bash shell csv sh

这是示例csv文件:

name,annotations,description
drgreghouse,princeton,"doctor,head"
sheldon,tbbt,"physicist,actor"
chandler,friends,"actor,comedian"

我正在尝试类似的操作,但它只读取第一个值

INPUT="$(pwd)/data.csv"
IFS=','
sed 1d $INPUT |while read name annotations description; do
    echo "$name $annotations $description"
done

O / p-

drgreghouse princeton "doctor
sheldon tbbt "physicist
chandler friends "actor

预期的O / p

drgreghouse princeton doctor,head
sheldon tbbt physicist,actor
chandler friends actor,comedian

1 个答案:

答案 0 :(得分:0)

sed和外壳没有CSV文件的概念。如果要处理CSV中带引号的字段,则必须自己处理带引号的字段,或切换到为您处理带引号的工具。

如果数据没有复杂的引号,则可以用数据中不会出现的不同定界符替换每个未引号的逗号(也许尝试|),然后从那里取走。如果您只想转换为空格分隔,请尝试此操作。

sed -e 1d -e 's/"\([^"]*\)",\|\([^[",]*\),/\1\2 /g' data.csv

演示:https://ideone.com/sg9crO

要使用其他定界符,请将\1\2之后的空格更改为该定界符。但是再次,请理解,这种快速而肮脏的regex hack无法处理所有CSV的报价规则。

顺便说一句,您不需要$(pwd)来引用当前目录;相对文件名总是已经相对于您当前的工作目录解析。