2011-12-04 9 views
0

名前に数字の入ったファイルがたくさんあります。各ファイル番号は、「グループ」または番号の範囲に属します。私はそれがあるグループ内のファイル番号を一致させて、それを変数としてエクスポートしたいと思います。私はこれを行う方法がわからないんだけど、私はそれはのようなものだろうと仮定します。bashの "grid arrays"の使い方は?

Array: 
(A, 1, 20) 
(B, 21, 34) 
(C, 35, 52) 
(D, 53, 68) 

最初の列がグループ名である場合は、2番目の列は範囲内の最初の数字と最後の列であります範囲内の最後の桁です。

if [ $num -ge "COLUMN2" ] && [ $num -le "COLUMN3" ]; then 
    groupname=COLUMN1 
fi 

私はコーディングに新たなんだとちょうどbashシェルを学び始めたので、あなたは私だけのbashでこれまでの方法を与えた場合、私は本当に希望:その後、私のようなものを適用することができます。また、while [ $num -ge "COLUMN3" ]を実行するだけで2番目の列は不要と思われますが、後でスクリプトの最初の列が必要です。

+0

をすることができます入力と期待される出力の例を挙げてください。 – drysdam

+0

2つのグループの数の間にギャップがありますか?上記の数字は1から68の間に隙間なしになります。 –

+0

入力は任意の数値になり、出力はその番号に対応するグループ名になります。だから私が37を入力すると、 "C"が出力されます。ファイルに次々にファイルが作成され、「総数」が付加されているため、ギャップはありません。ただし、最後の値より大きい数値は、その数値まで上昇するグループを追加するようにエラーメッセージを出力する必要があります。 – DeoxNa

答えて

2

bashのを本当に多次元配列を行いませんが、この目的のために、単一次元アレイのシリーズは、罰金を行う必要があります。

group_names=("A" "B" "C" "D") 
group_min=(1 21 35 53) 
group_max=(20 34 52 68) 

groupname= 
for ((i=0; i < ${#group_names[@]}; i++)); do 
    if [ $num -ge ${group_min[i]} ] && [ $num -le ${group_max[i]} ]; then 
     groupname="${group_names[i]}" 
     break 
    fi 
done 
if [ -z "$groupname" ]; then 
    echo "Oops, no matching group found!" 
fi 
+0

ありがとう!私は同様のことを考えていましたが、「きれいな」または正しい方法があるかどうかを知りたがっていました。 bashが「多次元配列」を行うことができないことを知っておいてください(多次元配列は3次元に拡張されますか、1と2だけに拡張されますか?それは素晴らしいでしょう)。 – DeoxNa

+0

なぜそれが必要ですか? for((i = 0; i <$ {#group_names [@]}; i ++)) '? $ {group_names [@]}のxで十分ではないでしょうか?私はコーディングに新しいので、2つの利点と違いを理解したいと思います。 – DeoxNa

+0

1:異なる言語にはさまざまな配列機能がありますが、一般的に、配列は必要な数の次元を持つことができます(231次元?問題ありません)。 2: 'for x" $ {group_names [@]} "'(グループ名の空白などの問題を避けるための二重引用符に注意してください)は、group_names配列を反復処理しますが、 group_minとgroup_maxの対応するエントリその代わりに、配列インデックスを繰り返し処理し、それを使って3つの配列すべての値にアクセスする必要があります。 –

0

これはあまりにもあなたのために働くかもしれない:

$ number=51 group= 
$ array=("A 1 20" "B 21 34" "C 35 52" "D 53 68") 
$ for element in "${array[@]}" 
> do read key min max <<<"$element" 
> ((number >= min && number <= max)) && group=$key && break 
> done 
$ [[ $group ]] && echo "number=$number group=$group" || echo "number=$number no match" 
$ number=51 group=C 
関連する問題