如何在 Bash 中解析 CSV 文件?

新手上路,请多包涵

我正在编写一个很长的 Bash 脚本。我想将 CSV 文件中的单元格读入 Bash 变量。我可以解析行和第一列,但不能解析任何其他列。到目前为止,这是我的代码:


  cat myfile.csv|while read line
  do
    read -d, col1 col2 < <(echo $line)
    echo "I got:$col1|$col2"
  done

它只打印第一列。作为附加测试,我尝试了以下方法:

read -d, x y < <(echo a,b,)

$y 是空的。所以我尝试了:

read x y < <(echo a b)

$y 是 b 。为什么?

原文由 User1 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 984
2 个回答

您需要使用 IFS 而不是 -d

 while IFS=, read -r col1 col2
do
    echo "I got:$col1|$col2"
done < myfile.csv

请注意,对于通用 CSV 解析,您应该使用专门的工具来处理带内部逗号的引用字段,以及 Bash 自身无法处理的其他问题。此类工具的示例是 cvstoolcsvkit

原文由 Dennis Williamson 发布,翻译遵循 CC BY-SA 3.0 许可协议

man 页面:

-d delim delim 的第一个字符用于终止输入行,而不是换行符。

您正在使用 -d, 它将终止逗号上的输入行。它不会读取该行的其余部分。这就是 $y 为空的原因。

原文由 dogbane 发布,翻译遵循 CC BY-SA 2.5 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题