2017-07-14 11 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 

を私はそれは私のループの問題です私がこれについて間違った方法をとっているかどうか教えてください!

+0

'エコー$ myArray'は'エコー "$ {myarrayの[$ i]を}" ' – Barmar

+0

は、なぜあなたはbash''でこれをやっているべきか? – chepner

答えて

0

2つの問題:

まず、ネストされたループは必要ありません。あなたはmyArrayを1回だけループする必要があります。

第2に、現在の要素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

同じシェルで2回実行しましたか?実行の間に '$ column'をクリアする必要があります。 – Barmar

+0

これを空にするには 'column =()'を実行します – Barmar