【问题标题】:How to read multiple values from a column of a .csv file in shell script [duplicate]如何从 shell 脚本中的 .csv 文件的列中读取多个值 [重复]
【发布时间】:2021-01-09 07:41:47
【问题描述】:

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

【问题讨论】:

  • @anubhava 我已经更新了预期的 o/p
  • 您可以使用tail -n +2 file获取您的输出
  • @Kunalkishor,或者您是否只想跳过 Input_file 中的标题并保留文件中的其余行?
  • @anubhava 与sed 1d 相比并没有真正的改进。
  • IFS 表示输入字段分隔符。这是read 用来区分列的字符。

标签: bash shell csv sh


【解决方案1】:

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

如果您的数据没有复杂的引用,您可以将每个未引用的逗号替换为数据中未出现的不同分隔符(尝试|)并从那里获取。如果你只是想转换为空格分隔,试试这个。

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

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

要使用不同的分隔符,请将\1\2 之后的空格更改为该分隔符。但同样,请理解这种快速而肮脏的 regex hack 无法处理 CSV 的全部引用规则。

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

【讨论】:

    猜你喜欢
    • 2019-02-10
    • 1970-01-01
    • 1970-01-01
    • 2022-01-05
    • 2017-09-01
    • 2021-08-31
    • 2017-12-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多