【问题标题】:creating a list / array from a text file or csv file using bash使用 bash 从文本文件或 csv 文件创建列表/数组
【发布时间】:2020-08-04 22:45:35
【问题描述】:

我正在尝试编写一个小的 shell 脚本来解析一个简单的 CSV 文件(只有一列)并将每个值中的值分配给一个需要是数组/列表的变量。

示例文件:

Title_ID
123
456
789
000

需要脚本来解析文件并将结果输出到名为 title 的变量中,这样 echo ${title[1]} 返回 456

这是我当前的脚本

while read line; do
temp_title[$i]="$line"
i=$((i++))
done < ./title_master_list.csv

我不断收到以下错误 zsh: temp_title: assignment to invalid subscript rang

知道我做错了什么吗?

【问题讨论】:

  • 抱歉,我可能弄乱了您帖子的格式,请恢复原状...
  • 您需要在循环之前定义i i=1 但这是zsh 还是bash 问题?
  • 您的标题说使用 bash,但该错误表明您使用的是 zsh...
  • 抱歉,我使用 zsh 而不是 bash 运行它

标签: bash shell zsh


【解决方案1】:

来自man zshparam

元素从 1 开始编号,除非设置了 KSH_ARRAYS 选项,在这种情况下它们从零开始编号。

所以,您遇到的问题是因为您尝试使用从 0 开始的索引,而不是 1。使用:

#!/usr/bin/zsh
typeset -a temp_title
i=1
while IFS= read -r line; do
    temp_title[i++]="$line" # Note the postincrement in the index expression
done < ./title_master_list.csv
echo "${temp_title[1]}"

但是有更好的方法来做到这一点,不使用循环,使用zshparameter expansion flags

temp_title=("${(@f)"$(<./title_master_list.csv)"}")

这会将文件在换行符处拆分为一个数组。

也可以用一个read来完成:

IFS=$'\n' read -r -d '' -A temp_title < ./title_master_list.csv

为了完整起见,其他基于循环的方法:

设置选项以使用从 0 开始的数组:

#!/usr/bin/zsh
setopt KSH_ARRAYS
typeset -a temp_title
i=0
while IFS= read -r line; do
    temp_title[i++]="$line"
done < ./title_master_list.csv
echo "${temp_title[0]}"

不要使用索引,使用+=()追加到数组中:

#!/usr/bin/zsh
typeset -a temp_title
while IFS= read -r line; do
    temp_title+=("$line")
done < ./title_master_list.csv
echo "${temp_title[1]}"

当使用bash 而不是zsh 时,使用mapfile 内置函数将文件读入数组:

mapfile -t temp_title < ./title_master_list.csv

真正的旧版本可能不得不使用:

IFS=$'\n' read -r -d '' -a temp_title < ./title_master_list.csv

(类似于zsh版本,但使用小写-a

【讨论】:

  • 为 bash 编写脚本时,请使用 IFS=$'\n' read -r -d '' -a array_var &lt;file 而不是 mapfile,因为对 read -a 的支持比对 mapfile 的支持范围更广。
  • @LéaGris 如果您使用的 bash 版本太旧而无法使用mapfile...我的同情。
  • 谢谢,这似乎成功了!如果您有时间,有几个关于数组的后续问题 - 1) 是否需要显式声明数组? 2) typeset -a 是声明数组的唯一方法吗?
  • @raja documentation 揭示了一切。
猜你喜欢
  • 1970-01-01
  • 2015-09-08
  • 2023-03-22
  • 1970-01-01
  • 2016-10-15
  • 2011-05-06
  • 1970-01-01
相关资源
最近更新 更多