如何在带有分隔符的2D数组中插入单词?使用BASH脚本

时间:2017-03-28 14:34:19

标签: arrays bash

在我的文本文件中,我有这个:

wordA | wordC

wordB | wordD

我想拥有这个数组:

   arr=(wordA|wordC wordB|wordD)
   arr[0]=(wordA wordC)
   arr[0][0]=(wordA)
   arr[0][1]=(wordC)
   arr[1]=(wordB wordD)
   arr[1][0]=(wordB)
   arr[1][1]=(wordD)

编辑:如果这不可能,我怎么能有这个数组:

   arr1=(wordA wordB)
   arr2=(wordC wordD)

2 个答案:

答案 0 :(得分:0)

如前所述,Bash不支持真正的2D数组,但可以使用关联数组进行模拟。

这样的东西似乎在我的测试中正常工作:

a=$'a|c\nb|d'
echo "$a" && echo

declare -A array
IFS=$'\n' read -r -d '' -a arr1 <<<"$a"
#declare -p arr1
for ((i=0;i<"${#arr1[@]}";i++));do
  IFS="|" read -r -a arr2 <<<"${arr1[$i]}"
  for ((k=0;k<"${#arr2[@]}";k++));do
    array[$i,$k]="${arr2[$k]}"
  done
done
declare -p array

输出:

a|c
b|d

declare -A array='([0,0]="a" [0,1]="c" [1,0]="b" [1,1]="d" )'

所以我们创建了一个名为&#34; array&#34;的关联数组。可以采用以下格式:

echo "${array[1,0]}"
#Output
b

您可以使用经典的双循环或使用

更简单地遍历数组的所有键
for key in "${!array[@]}";do
echo "$key - ${array[$key]}"
done
0,0 - a
0,1 - c
1,0 - b
1,1 - d

答案 1 :(得分:-1)

不完全是,但你明白了:

arr=(wordA\|wordC wordB\|wordD)

echo "${arr[0]%|*}" # arr[0][0]
echo "${arr[0]#*|}" # arr[0][1]
echo "${arr[1]%|*}" # arr[1][0]
echo "${arr[1]#*|}" # arr[1][1]

当您从文件中读取项目时,您可能不必担心转义管道,但通常我必须创建阵列:)