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



这是示例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

sed和shell没有CSV文件的概念。如果你想在CSV中处理带引号的字段,你必须自己处理带引号字段,或者切换到一个为你处理它们的工具。

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

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

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

要使用不同的分隔符,请将12后面的空格更改为该分隔符。但是,请再次理解,这种快速而肮脏的regex破解无法处理CSV的所有引用规则。

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

最新更新