Bash - 将Postgresql零分隔字段读入数组

时间:2014-10-30 05:32:20

标签: arrays bash postgresql

我想将使用--field-separator-zero生成的psql查询的输出读入我的bash脚本中的数组。我尝试过的最好的是以下内容:

psql -w  -t --quiet --no-align --field-separator-zero -c $'select nickname,first_name,last_name,email from users' | while IFS= read -d '' -a USERS; do 
     echo ${USERS[0]} ${USERS[1]} ${USERS[2]} ${USERS[3]}; 
done;

上面会将一行的每个字段作为新数组返回。将分隔符更改为其他任何内容都会使该过程正常工作,但问题是昵称字段可能包含任何字符,因此我不得不使用安全NUL字符作为分隔符。有没有办法做到这一点?

1 个答案:

答案 0 :(得分:2)

我在这里假设昵称是唯一的密钥;如果在该角色中应该使用不同的字段,则进行适当的修改。

以下代码将数据读入一系列关联数组,并依次发出每一行。

请注意,关联数组是Bash 4的一个特性;如果您使用的是运行3.2的Mac OS,请使用MacPorts或类似工具安装现代版本。

declare -A first_names=( ) last_names=( ) emails=( )
while IFS= read -r -d '' nickname && \
      IFS= read -r -d '' first_name && \
      IFS= read -r -d '' last_name && \
      IFS= read -r -d '' email; do
  first_names[$nickname]=$first_name
  last_names[$nickname]=$last_name
  emails[$nickname]=$email
done < <(psql ...)

echo "Found users: "
for nickname in "${!emails[@]}"; do
  printf 'nickname - %q\n' "$nickname"
  printf 'email - %q\n' "${emails[$nickname]}"
  printf 'first name - %q\n' "${first_names[$nickname]}"
  printf 'last name - %q\n' "${last_names[$nickname]}"
  echo
done

BashFAQ #1中描述了这种技术 - 搜索-print0以便找到它。