2016-05-12 128 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 - 打印

我希望這有助於。讓我知道。