【问题标题】:Storing multiple columns of data from a file in a variable将文件中的多列数据存储在变量中
【发布时间】:2015-06-16 20:54:31
【问题描述】:

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

Box 12
Toy 85
Dog 13
Bottle 22

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

【问题讨论】:

  • @Jahid,我注意到您回滚了“键/值”描述符。您是否有更好的方法来使问题的标题描述我们想要一次阅读多个列?如果它对这种效果没有某种限制(“多列数据”,也许吧?),它与许多许多预先存在的问题重复,并且对于试图找到问题的人来说并不能清楚地区分这符合他们想要做的事情。
  • @CharlesDuffy 好吧,OP 并没有说他想要键/值类型数据,这就是回滚的原因,是的,它需要编辑得更具体......可能是“存储空格分隔的数据..."
  • “空格分隔”可能只是被加载到单个数组中的单行。除非你反对,否则我将在这里使用“多列数据”。
  • @CharlesDuffy 是的,这太完美了..

标签: bash file


【解决方案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

数据存储在两个数组变量中:textarrnumarr。 您可以使用索引${textarr[$index]} 访问它们中的每一个,或者使用${textarr[@]} 一次访问所有它们

【讨论】:

  • 该方案的缺点(与关联数组相比)是相对难以找到包含“Dog”的索引并从中找到数字为 13。另一方面,您仍然可以回答“如果数字是 13,名称是什么”这个问题,这对于关联数组来说是比较困难的。
【解决方案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 拆分字段,将列放入它们各自的变量中(如果存在的列多于命名的变量,则该行的其余部分进入最后一个命名的变量)。

【讨论】:

    【解决方案3】:

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

    【讨论】:

      猜你喜欢
      • 2019-09-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-02-08
      • 2015-12-08
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多