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



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

Box 12
Toy 85
Dog 13
Bottle 22

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

示例代码:

#!/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[@]}一次访问所有这些

将所有数据读入单个关联数组(在 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 拆分字段,将列放入各自的变量中(如果存在的列数多于命名的变量数,则行的其余部分将进入命名的最后一个变量)。

在这里,我提供了我自己的解决方案,应该讨论一下。 我不确定这是否是一个好的解决方案。 使用 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"

相关内容

  • 没有找到相关文章

最新更新