2014-02-06 93 views
1

我有一個sqlite數據庫表,有三列存儲名稱,位置和註釋。看起來,一切正確存儲,因爲當使用sqlite命令行我看到正確的列數和數據正確分組。如何在bash中選擇一個包含多行的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 

我結束了一切正常,直到在備註欄中第一個換行符。在此之後,每條筆記線被視爲一個新的行。什麼是在bash中處理這個問題的正確方法?

+1

你應該看看['.mode'(https://開頭www.sqlite.org/sqlite.html)命令到'sqlite3'。 –

回答

0

由於數據是管道分離的,你可以這樣做(未測試):將每行讀入一個數組;檢查陣列的大小

  • 如果3個字段,那麼你有一個從數據庫的行,但筆記字段可能是不完整的。用前面的行做些什麼,現在它有一個完整的註釋字段。
  • 如果找到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 
    } 

你最好採取措施保證備註字段不包含的字段分隔符(|

相關問題