存储变量中文件的多列数据

时间:2015-06-16 20:54:31

标签: bash file

我正在尝试从文件中读取它包含的数据,并从文件中获取2个重要数据,并在bash脚本中使用它。一个字符串,然后是一个数字,例如:

Box 12
Toy 85
Dog 13
Bottle 22

我在想我可以编写一个while循环来遍历文件并将数据存储到变量中。但是我需要两个不同的变量,一个用于数字,一个用于单词。如何将它们分成两个变量?

3 个答案:

答案 0 :(得分:2)

将所有数据读入单个关联数组(在bash 4.0或更新版本中):

#!/bin/bash
declare -A data=( )
while read -r key value; do
   data[$key]=$value
done <file

完成后,您可以有效地通过密钥检索值:

echo "${data[Box]}"

...或迭代所有键:

for key in "${!data[@]}"; do
  value=${data[$key]}
  echo "Key $key has value $value"
done

您会注意到read在其参数列表中有多个名称。当给出多个参数时,它会通过IFS拆分字段,将列放入各自的变量中(如果存在的列数多于命名的列数,则列的其余部分将进入最后一个变量名称。)

答案 1 :(得分:1)

示例代码:

#!/bin/bash
declare -a textarr numarr
while read -r text num;do
textarr+=("$text")
numarr+=("$num")
done <file
echo ${textarr[1]} ${numarr[1]} #will print Toy 85

数据存储在两个数组变量中:textarr numarr。 您可以使用索引${textarr[$index]}或使用${textarr[@]}

一次访问所有这些内容

答案 2 :(得分:0)

在这里,我提供了我自己的解决方案,应该进行讨论。我不确定这是一个好的解决方案。使用while read构造具有启动新shell的缺点,并且它将无法更新循环外的变量。这是一个示例代码,您可以修改它以满足您自己的需要。如果您要使用更多列数据,则需要进行微调。

#!/bin/sh

res=$(awk 'BEGIN{OFS=" "}{print $2, $3 }' mytabularfile.tab)

n=0
for x in $res; do 
    row=$(expr $n / 2)
    col=$(expr $n % 2)
    #echo "row: $row column: $col value: $x"
    if [ $col -eq 0 ]; then
        if [ $n -gt 0 ]; then
            echo "row: $row "
            echo col1=$col1 col2=$col2
        fi
        col1=$x
    else
        col2=$x
    fi
    n=$(expr $n + 1)
done
row=$(expr $row + 1)
echo "last row: $row  col1=$col1 col2=$col2"