2014-12-13 8 views
0

В основном мне нужно найти несколько сотен * .DB3 файлов на трех или четырех наших сетевых ресурсах и выполнить скрипт SQLite3 для всех из них, извлекая выходы в новый файл DB3 или даже файл CSV; но мой скрипт оболочки очень ржавый, и я был бы признателен за любую помощь.Shell Scripting + SQLite3

Использование либо Windows CLI, либо что-то, что может быть выполнено в Cygwin, как создать скрипт для поиска до трех именованных разделов (или вставленных букв диска) для всех файлов с определенным хранилищем файлов (* .DB3) эти полные пути и имена файлов в массиве или файле, а затем удалить любые дублированные имена файлов.

Для всех файлов в этом списке мне необходимо запустить предварительно определенный скрипт SQLite3.exe (пример ниже) для всех этих файлов и вывести эти данные в новый файл DB3 или даже файл CSV.

SELECT Product.Type AS 'Product', Product.Identifier AS SKU; 

ответ

0

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

find /share/one /path/to/share/two \ 
    /export/third/share -type f -name '*.DB3' -printf '%f\t%p\n' 

Pass, что sort | awk и создать простой скрипт для печати только уникальные имена. Означает ли порядок дубликатов? Возможно, вы хотели бы проверить, какой дубликат старше, вместо слепого сохранения только первого или последнего? Но вот простой сценарий Awk, который делает первый.

awk -F '\t' '!a[$1]++ { print $2 }' 

Чтобы соединить части, запустить find | sort | awk | xargs sqlite3 'your commands'

Если вам нужно что-то немного более активное участие, вы можете прочитать список без дубликатов файлов в цикле:

find /share/one /path/to/share/two \ 
    /export/third/share -type f -name '*.DB3' -printf '%f\t%p\n' | 
sort | 
awk -F '\t' '!a[$1]++ { print $2 }' | 
while read file; do 
    sqlite3 "complex things with $file; more things; commit; done; etc" 
done >output 
+0

Вторая часть вопрос заключается в том, как использовать массив для подачи исполняемого файла sqlite3 и запускать команды attach, query и detach для каждой базы данных. В файле базы данных это: Прилагайте «имя файла» в качестве db1 go SELECT Product.Type AS 'Product', Product.Identifier AS PartNo, GROUP BY Product.Identifier; detach db1 Это результат состояния SELECT для каждого файла базы данных, который мне нужен, тогда вам нужно отправить в другую базу данных, чтобы собрать эту информацию из всей базы данных, или, как альтернатива, файл csv также будет работать. – rustyadmin

+0

Недостаточно знаний с 'sqlite3', чтобы покрыть эту часть, и это было не очень ясно в исходном вопросе; но обновил ответ с помощью другого намека. – tripleee