Bash скрипт для заполнения таблицы sqlite не работает должным образом - PullRequest
0 голосов
/ 26 апреля 2019

Я создал скрипт Bash для просмотра файлов в каталоге, извлечения данных на основе идентификатора, а затем использования этих данных для заполнения таблицы sqlite3. Кажется, некоторая информация будет заполнена в той же строке, что и ключ, а другая - нет. Сценарий выглядит следующим образом:

#!/bin/bash

sqlite3 review.sql "CREATE TABLE Review(Review_ID INTEGER PRIMARY KEY, Author TEXT, Date TEXT);"

path="/home/me/Downloads/test/*"

for i in $path
do
        total=$(grep -c '<Author>' $i)
        count=1
        while [ $count -le $total ]
        do
                date=$(grep -m$count '<Date>' $i | sed 's#<Date>##' | tail -n1)
                author=$(grep -m$count '<Author>' $i | sed 's#<Author>##' | tail -n1)
                sqlite3 review.sql "INSERT INTO Review(Author,Date) VALUES('$author','$date');"
                ((count++))
        done
done

Файлы, которые я просматриваю, выглядят так:

<Author>john
<Date>Jan 6, 2009

<Author>jacob
<Date>Dec 26, 2008

<Author>rachael
<Date>Dec 14, 2008

когда я запрашиваю первичный ключ и атрибуты даты, я получаю это как ожидалось

sqlite> SELECT Review_ID, Date FROM Review;
Review_ID   Date        
----------  ------------
1           Jan 6, 2009
2           Dec 26, 2008
3           Dec 14, 2008
4           Jan 7, 2009
5           Jan 5, 2009
6           Nov 14, 2008

но когда я запрашиваю первичный ключ и автора, я получаю это

sqlite> SELECT Review_ID, Author FROM Review;
Review_ID   Author    
----------  ----------
            john
            jacob
            rachael
            Jean
            kareem
            may

После проведения еще одного тестирования определенно возникают проблемы с некоторыми текстовыми строками. Например, я попытался добавить фамилии и получить такой результат:

Review_ID   Author
----------  ------------
1            john jacob
2            jacob richa
             rae simon
             Jean jak
5            kareem jabr
6            may flower

Это работает лучше, но все еще не нравится пара из них, я подумал, может быть, что-то делать с тремя буквами, но тогда «май» не появится, но, действительно, если я добавлю букву в «rae» "и письмо" jak "3 и 4 действительно отображаются в столбце Review_ID. Я заметил, что то же самое происходит, если столбец содержит «$», например, в «$ 173». Текст, я действительно не могу понять, хотя, кажется, нет очевидного абсолютного образца того, что он принимает, а что нет. Я составил имена, чтобы упростить этот пост, но просто для того, чтобы привести еще несколько примеров, я включу еще несколько примеров из того, с чем я на самом деле работаю, чтобы показать еще несколько строк, которые работают, и те, которые не работают .

1           everywhereman2
            RW53  
            Marilyn1949
            fallriverma
8           SweetwaterMill
            AuntSusie006
13          Traveler34NewJe
            madmatriarch
 2          Savvytourist2
            greatvictory
25          Lightsleeper999
            strollaround
30          Lucygoosey1985
            lesbriggs
 3          miguelluna019
            lulubaby
 1          myassesdragon
            tomu023
            BrettOcean
46          A TripAdvisor M
            dmills1956
            julcarl
49          A TripAdvisor M
            TSW42
            lass=

Ответы [ 2 ]

1 голос
/ 26 апреля 2019

После пробного запуска снимите echo, чтобы снять предохранитель.

awk -v RS='' -v FS='\n?<[^>]+>' '{print $2 ":" $3}' \
    /home/me/Downloads/test/* |while IFS=: read author date; do
      echo sqlite review.sql "INSERT INTO Review(Author,Date) VALUES('$author','$date');"
    done

Это хрупкое решение awk-to-bash, основанное на использовании регулярного выражения \n?<[^>]+> в качестве Разделителя полей и пустой строки '' в качестве Разделителя записей. Выражение FS означает «необязательный символ новой строки, за которым следует строка, заключенная в углы». Затем мы выводим поля с помощью простого разделителя : и читаем их в bash.

Вы можете совершать системные вызовы в awk с помощью system(), но это очень быстро запутывается. В этом случае лучше экспортировать чистые данные.

0 голосов
/ 27 апреля 2019

Сценарий с awk и printf:

#!/bin/bash

sqlite3 review.sql "CREATE TABLE Review(Review_ID INTEGER PRIMARY KEY, Author TEXT, Date TEXT);"

path="/home/drew/Downloads/testcases/*"

for i in $path
do
        total=$(grep -c '<Author>' $i)
        count=1
        while [ $count -le $total ]
        do
                date=$(grep -m$count '<Date>' $i | sed 's#<Date>##' | tail -n1)
                author=$(grep -m$count '<Author>' $i | sed 's#<Author>##' | tail -n1 | awk '{printf "-      %s      -", $1}')
                echo $author
                ((count++))
        done
done

Я не уверен, но я чувствую, что мне не нужно добавлять к нему эхо с помощью printf, но без него ничего не печатается. С эхом я получаю следующий вывод:

 -Jeanjakey
- kareem -
- may -
- RW53 -
 -Marilyn1949
 -AuntSusie006
 -madmatriarch
 -strollaround
 -lulubaby
 -tomu023
 -julcarl
 -slass

Кажется, что-то работает, но интервал исчезает, любые фамилии исчезают, и кажется, что он делает разные вещи для разных входов. С конкатенацией строк я использую скрипт:

#!/bin/bash

sqlite3 review.sql "CREATE TABLE Review(Review_ID INTEGER PRIMARY KEY, Author TEXT, Date TEXT);"


path="/home/drew/Downloads/testcases/*"

for i in $path
do
        total=$(grep -c '<Author>' $i)
        count=1
        while [ $count -le $total ]
        do
                date=$(grep -m$count '<Date>' $i | sed 's#<Date>##' | tail -n1)
                author2="-   "
                author2+=$(grep -m$count '<Author>' $i | sed 's#<Author>##' | tail -n1)
                author2+="    -"
                echo $author
                ((count++))
        done
done

с этим я получаю вывод:

 -Jeanjakey
 -kareem jabron
 -may flow she
 -RW53 
 -Marilyn1949
 -AuntSusie006
 -madmatriarch
 -strollaround
 -lulubaby
 -tomu023
 -julcarl
 -slass

и переназначение строки:

author2=$(grep -m$count '<Author>' $i | sed 's#<Author>##' | tail -n1)
author2="-   $author2     - "

дает тот же вывод.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...