2017-07-14 20 views
0

我正在嘗試編寫一個.txt文件,將每行文本排序到一個數組中,然後在出現豎線分隔符(|)時根據每個行條目創建另一個數組。 我已經編寫了代碼,主要工作,但我有一些問題的輸出。Bash數組本身

#!/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 

我幾乎肯定這是我的循環問題,b讓我知道,如果我是這樣做的錯誤!

+0

'回聲$ myArray'應該是'回聲 「$ {myArray的[$ i]}」' – Barmar

+0

你爲什麼用'bash'這樣做呢? – chepner

回答

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 
+0

謝謝!這主要起作用,但由於某種原因重複輸出的數量等於「列」中的條目總數。任何想法爲什麼? – WashU

+0

你在同一個shell中運行過兩次嗎?您需要在運行之間清除「$ column」。 – Barmar

+0

做'column =()'把它清空 – Barmar