如何在Bash中选择具有多行的SQLite列

  • 本文关键字:SQLite Bash 选择 bash sqlite
  • 更新时间 :
  • 英文 :


我有一个SQLITE数据库表,其中包含三列,该列存储了名称,位置和注释。似乎所有内容都正确存储了,就像使用SQLite命令行时,我看到了正确的列数,并且数据正确分组。

使用BASH脚本(这是一个要求)来访问数据时问题。"注释"列存储可能是多行(带有新线等)的数据。当我查询此表时,请使用以下内容:

stmt="Select name, location, notes from t1"  
sqlite3 db "$stmt" | while read ROW;   
do  
  name=`echo $V_ROW | awk '{split($0,a,"|"); print a[1]}'`  
  location=`echo $V_ROW | awk '{split($0,a,"|"); print a[2]}'`  
  notes=`echo $V_ROW | awk '{split($0,a,"|"); print a[3]}'`  
done

我最终都以正常状态,直到注释列中的第一个newline字符为止。此后,每个音符行被视为新行。在bash中处理此问题的正确方法是什么?

由于数据是管道分开的,因此您可以执行此操作(未经测试):将每行读为数组;检查数组的大小

  • 如果3个字段,则您可以从DB上行,但是Notes字段可能不完整。使用上一个行做点事
  • 如果找到了1个字段,请将字段值附加到当前笔记字段。
  sqlite3 db "$stmt" | {
    full_row=()
    while IFS='|' read -ra row; do  
      if [[ ${#row[@]} -eq 3 ]]; then
        # this line contains all 3 fields
        if [[ ${#full_row[@]} -eq 0 ]]; then
           : # "row" is the first row to be seen, nothing to do here
        else
           name=${full_row[0]}
           location=${full_row[1]}
           notes=${full_row[2]}
           do_something_with "$name" "$location" "$notes"
           #
           # not necessary to use separate vars
           # do_something_with "${row[@]}"
        fi
        # then store the current row with incomplete notes
        full_row=( "${row[@]}" )     
      else
        # only have notes.
        full_row[2]+=" "${row[0]}
      fi
    done
  }

您最好采取步骤以确保音符字段不包含您的字段分离器(|

相关内容

  • 没有找到相关文章

最新更新