我有一个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
}
您最好采取步骤以确保音符字段不包含您的字段分离器(|
)