来自文件的数组

时间:2012-05-25 17:17:14

标签: bash

如果我有这样的文件:

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,我不知道如何将元素添加到数组

3 个答案:

答案 0 :(得分:3)

引用修复所有内容:

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

引用变量"$line"是有所作为的。如果您没有使用“C:c”,那可能是因为您的文件缺少最终换行符。

答案 1 :(得分:0)

使用Command Substitution

declare -a one
declare -a two

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

var=$(command)捕获命令的输出并将其分配给var。外部的parens使它成为一个数组赋值。 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 ...

答案 2 :(得分: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" ]位以防止此问题。