GNU/Linux >> Belajar Linux >  >> Linux

Periksa Pola Yang Tidak Ada Di Sqlite?

Saya menjelaskan situasi serupa dengan file teks biasa di Grep sejumlah besar pola dari file besar. Banyak orang di sana mengatakan saya harus melakukannya, jadi sekarang saya memigrasikan data saya ke database sqlite:

Saya memiliki file tempat saya mengekstrak sekitar 10.000 pola. Kemudian saya memeriksa apakah database tidak mengandung pola seperti itu. Jika tidak, saya harus menyimpannya secara eksternal di file untuk diproses lebih lanjut:

for id in $(grep ^[0-9] keys); do
  if [[ -z $(sqlite3 db.sqlite "select id from main where id = $id") ]]; then
    echo $id >>file
  fi
done

Karena saya baru mengenal SQL, saya tidak dapat menemukan cara sederhana untuk melakukan ini. Juga, loop ini tidak berguna karena 20 kali lebih lambat dari yang saya capai dengan awk pada URL yang disebutkan.

Karena basis datanya sangat besar, terus bertambah, dan saya sering menjalankan loop ini, apakah mungkin untuk membuatnya lebih cepat?

Jawaban yang Diterima:

Untuk setiap pola, Anda memanggil instance baru sqlite program yang terhubung ke database baru. Itu sia-sia. Anda harus membuat satu kueri yang mencari salah satu kunci, lalu menjalankan satu kueri itu. Klien basis data pandai mengeksekusi kueri besar.

Jika baris yang cocok di keys file hanya berisi angka, maka Anda dapat membuat kueri sebagai berikut:

{
  echo 'select id from main where id in (';
  <keys grep -x '[0-9][0-9]*' |     # retain only lines containing only digits
  sed -e '1! s/^/, /' |             # add ", " at the beginning of every line except the first
  echo ');'
} | sqlite3 db.sqlite

Untuk data input yang lebih umum, Anda mendapatkan ide:gunakan transformasi teks untuk membuat satu kueri besar. Berhati-hatilah untuk memvalidasi masukan Anda; di sini kami memastikan bahwa apa yang disuntikkan ke dalam kueri valid secara sintaksis. Sebenarnya ada kasus sudut dalam contoh di atas:jika tidak ada kecocokan dalam file, maka sintaks SQL tidak valid; jika itu mungkin terjadi, Anda harus memperlakukan kasus ini secara khusus. Berikut kode yang lebih kompleks yang menangani kasus kosong:

<keys grep -x '[0-9][0-9]*' |
if read first; then {
    echo 'select id from main where id in (' "$first"
    sed -e 's/^/, /'
    echo ');'
  } | sqlite3 db.sqlite
fi

Linux
  1. Bagaimana cara memeriksa sintaks sudoers

  2. Bash Script:Periksa Apakah File Adalah File Teks?

  3. Bagaimana Cara Memeriksa Kemajuan Running Cp?

  1. Membaca Pola Grep Dari File?

  2. Analisis pemeriksaan bug Windows

  3. Temukan file lalu cd ke direktori itu di Linux

  1. Bagaimana cara memeriksa syslog di Bash di Linux?

  2. Bagaimana cara membuat file hanya jika tidak ada?

  3. Bagaimana cara memeriksa apakah suatu file kosong di Bash?