2016-05-12 181 views
0

我有一个带有2列的表的sqlite。我想在每个变量或数组中获取列的两个值。例如:用bash获取查询字符串

table A 
COLUMN A   COLUMN B 
credit and risk David 
nothing   susan 
..... 

,我想获得:变量=“信用和风险”和变量B =“大卫”,那么变量a =“一无所有”和变量B =“苏珊”等。 我想用这些代码,但如果列A有空间,我不能得到字符串完整,例如我只获得“信用”。我的代码:

valores=($(sqlite3 alcampo.db "select DESCRIPTION, URL FROM SUBCATEGORYS")) 

cnt=${#valores[@]} 
echo "cuenta es ... $cnt" 
for ((i=0 ; i<cnt ; i++)) 
do 
    echo "Record No. $i: ${valores[$i]}" 
    fieldA=${valores[0]} 
echo "campo a es ... $fieldA" 
    fieldB=${valores[1]} 
echo "campo B es ... $fieldB" 

done 

请问您能帮我吗?谢谢

+0

请参阅[Bash FAQ 001](http://mywiki.wooledge.org/BashFAQ/001)以获取有关如何从流中读取行的帮助。然后,您只需在数据中选择*不是*的分隔符即可分割。 –

回答

1

可能有更好的方法来完成这件事。
这听起来像你不想在你回应它们后保留变量。

while read line; do 

    fieldA=$(echo "$line" | sed -n "s/\(.*\)\s\{2,\}.*/\1/p") 
    fieldB=$(echo "$line" | sed -n "s/.*\s\{2,\}\(.*\)/\1/p") 

    echo "campo A es ... ${fieldA}" 
    echo "campo B es ... ${fieldB}" 

done < <(sqlite3 alcampo.db "select DESCRIPTION, URL FROM SUBCATEGORYS") 

这将使您的命令“sqlite3 ...”直接进入while循环。 while循环会将每行分配给变量“$ line”。

然后,我们回显$ line变量并将其sed来获取我们想要的信息。 sed基于列之间有2个或更多空格......这是我认为根据您发布的内容划分数据的唯一方法。

  • $() - 命令替换
  • -n - 不打印
  • 秒 - 替代
  • \( - 开始捕捉组1
  • * - 匹配任何
  • \) - 端捕获组1
  • \ S {2,} - 2个或更多个空白字符
  • * - 别的
  • \ 1 - 输出捕获组1
  • p - 打印

我希望这有助于。让我知道。