【问题标题】:Reading text from flat file into variables将文本从平面文件读入变量
【发布时间】:2016-07-25 11:59:53
【问题描述】:

我有一些数据存储在一个平面文件中,类似于下面显示的数据。我需要能够将数据提取到变量中,例如变量 AGE 等于 24,变量 user 等于 user01。我还需要能够知道数据是用于哪个数据库的,例如 db[0] 和 db[1] 等等。

db[0].age="24"
db[0].user="user01"
db[0].password="pasword01"
db[0].office="usa office 1"

db[1].age="44"
db[1].userID="user01"
db[1].userPW="password02"
db[1].office="uk office 2"

到目前为止,我所做的是使用 awk 搜索所有年龄实例,并将方括号中的数字提取到数组中。

databaseCount=($(awk '/'"age"'/' flatFile | cut -d "[" -f2 | cut -d "]" -f1))

我当时正在考虑使用类似的 awk 来提取括号中的文本并将该数据放入数组中。

age=($(awk '/'"dbUserAlias"'/' flatFile | cut -d\" -f2))

然后我打算使用 databaseCount 来查找 weach 数组的数据,所以我会知道在 age 数组的元素 0 中找到的数据是针对数据库 0 的,而在元素 1 中找到的数据是在数据库 1 中找到的数据。

我遇到的问题是在语音标记之间找到的一些文本有空格。

echo ${office[0]} 

将返回“uk”而不是“uk office 2”。

有谁知道如何解决这个问题,或者是否有更好的方法来提取数据?

谢谢。

【问题讨论】:

  • 您是否有需要此数据的现有 bash 脚本?或者您只是想为一些尚未成文的脚本处理这个问题?如果是后者,那么直接在 awk 中完成所有操作。实际上,该输入实际上已经是有效的 awk(如果需要,可以将其操作为有效的 awk 或由可能“更安全”的 awk 解析)。试图将其分割成 shell 数组是自找麻烦。

标签: linux bash


【解决方案1】:

当 flatFile 被格式化时

age="24"

您可以获取该文件。
当你忽略db[n]时,你可以使用

. <(cut -d"." -f2- flatFile)

现在我们要拆分每个 db 的文件并处理每个 db 的行:

for db in {0..5}; do
   sourcelines=$(grep "^db\[${db}\]" flatFile)
   if [[ -n "${sourcelines}" ]]; then
      echo "Database db[${db}]"
      . <(cut -d"." -f2- <<< "${sourcelines}" )
      # show the variables that have been set
      set | grep -E "^age=|^userID=|^userPW=|^office=" | sort
   fi
done

当你想为不同的数据库使用不同的变量时,你需要做一个小改动:

for db in {0..5}; do
   sourcelines=$(grep "^db\[${db}\]" flatFile)
   if [[ -n "${sourcelines}" ]]; then
      echo "Database db[${db}]"
      . <(echo -e "${sourcelines}" | tr "\[\]\." "_")
      # show the variables that have been set
      set | grep -E "^db_${db}_" | sort
   fi
done

【讨论】:

    【解决方案2】:

    如果您以这种方式访问​​数组,则应将元素封装在双引号中,请将您的代码替换为以下内容:

    age=($(printf "\"$(awk '/'"dbUserAlias"'/' flatFile | cut -d\" -f2)\""))
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-09-11
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多