-2

次のようなファイルがある場合:

A:a
B:b
C:c

次のような2つの配列を作成する必要があります

one=('A' 'B' 'C')
two=('a' 'b' 'c')

どうすればbashでそれを行うことができますか?

私はこれを試しました:

declare -a one
declare -a two

while read line
do
    IFS=':' read -ra ADDR <<< $line
    echo ${ADDR[0]}
    echo ${ADDR[1]}
done < file.txt

すみません、仕事から書いて帰宅しました。またすみません。これに関する問題は、それが印刷されていることです

littlelion:Documents dierre$ sh prova.sh 
A a

B b

C c がなく、配列に要素を追加する方法がわかりません

4

3 に答える 3

3

引用はすべてを修正します:

while read line
do
    IFS=':' read -ra ADDR <<< "$line"
    echo ${ADDR[0]}
    echo ${ADDR[1]}
done < file.txt

変数"$line"を引用することが違いを生んだのです。「C:c」の行が表示されない場合は、ファイルに最後の改行がない可能性があります。

于 2012-05-25T18:15:44.867 に答える
0

コマンド置換を使用する:

declare -a one
declare -a two

one=( $(cut -d: -f1 file) )
two=( $(cut -d: -f2 file) )

var=$(command)コマンドの出力をキャプチャし、に割り当てますvar。外側の親はそれを配列の割り当てにします。 cut -d: -f1ファイルをコロンで区切られたファイルとして扱い、最初のフィールドを出力するように指示します。 cut -d: -f2同じことをしますが、2番目のフィールドを出力します。


OPの編集に応じて編集する

あなたはADDRそのように直接読むことができます:

declare -a ADDR
while IFS=':' read -a ADDR; do
  echo ${ADDR[0]}
  echo ${ADDR[1]}
done < file.txt

それはアレイoneにデータを入力しませんがtwo...

于 2012-05-25T17:22:27.067 に答える
0

あなたが適切にやろうとしていることを理解していれば、これはうまくいくはずです:

one=()
two=()
while IFS=: read new_one new_two || [ -n "$new_one" ]; do
    one+=("$new_one")
    two+=("$new_two")
done
echo "one:" "${one[@]}"
echo "two:" "${two[@]}"

注:改行で終わっていないため、最終行が処理されていないという@Dennis Williamsonに同意します。|| [ -n "$new_one" ]これが問題にならないようにビットを追加しました。

于 2012-05-26T00:29:41.183 に答える