这是示例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
答案 0 :(得分:0)
sed
和外壳没有CSV文件的概念。如果要处理CSV中带引号的字段,则必须自己处理带引号的字段,或切换到为您处理带引号的工具。
如果数据没有复杂的引号,则可以用数据中不会出现的不同定界符替换每个未引号的逗号(也许尝试|
),然后从那里取走。如果您只想转换为空格分隔,请尝试此操作。
sed -e 1d -e 's/"\([^"]*\)",\|\([^[",]*\),/\1\2 /g' data.csv
要使用其他定界符,请将\1\2
之后的空格更改为该定界符。但是再次,请理解,这种快速而肮脏的regex hack无法处理所有CSV的报价规则。
顺便说一句,您不需要$(pwd)
来引用当前目录;相对文件名总是已经相对于您当前的工作目录解析。