-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做同样的事情,但它打印第二个字段。


编辑以响应 OP 的编辑

ADDR您可以像这样直接读入:

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

虽然这不会填充数组onetwo......

于 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 回答