我正在尝试编写一个接收.txt文件的代码,将每行文本排序到一个数组中,然后每当出现垂直条分隔符(|)时,根据每个行条目创建另一个数组。 我编写的代码大部分都有效,但我对输出有一些问题。
#!/bin/bash
mapfile -t myArray < placeholder.txt
for (( i = 0 ; i < ${#myArray[@]} ; i++))
do
#echo "Element [$i]: ${myArray[$i]}"
declare -a column
for (( i = 0 ; i < ${#myArray[@]} ; i++))
do
column+=( $(echo $myArray | tr "|" " ") )
done
for (( i = 0 ; i < ${#column[@]} ; i++))
do
echo "Element [$i]: ${column[$i]}"
done
done
如果输入数据是:
example|of|data|in|array
more|array|data
我希望输出看起来像这样:
Element [0]: example
Element [1]: of
Element [2]: data
Element [3]: in
Element [4]: array
Element [5]: more
Element [6]: array
Element [7]: data
但相反,我得到了:
Element [0]: example
Element [1]: of
Element [2]: data
Element [3]: in
Element [4]: array
Element [5]: example
Element [6]: of
Element [7]: data
Element [8]: in
Element [9]: array
我几乎肯定这是我的循环问题,但如果我以错误的方式解决这个问题,请告诉我!
答案 0 :(得分:0)
两个问题:
首先,不需要嵌套循环。您只需要遍历myArray
一次。
其次,你没有回显myArray
的当前元素,你总是回显第一个元素,因为你遗漏了数组索引。
您可以使用for var in
而不是使用数组索引。而不是管道到tr
,而是将IFS
设置为管道分隔符。
mapfile -t myArray < placeholder.txt
declare -a column
for line in "${myArray[@]}"
do
IFS='|'
column+=( $line )
done
for (( i = 0 ; i < ${#column[@]} ; i++))
do
echo "Element [$i]: ${column[$i]}"
done