gnu parallel mysql ЗАГРУЗИТЬ ДАННЫЕ ЛОКАЛЬНЫЙ ИНФАЙЛ

Я пытаюсь использовать GNU parallel для выполнения нескольких команд mysql LOAD DATA LOCAL INFILE, где:

  • {1} - это имя файла, который я получаю из командной строки поиска UNIX.
  • {2} - результат chop.pl скрипта, который распечатывает определенный токен из строки файла в соответствии с определенными правилами.

Кажется, я правильно называю GNU parallel, за исключением того, что он не сохраняет двойные кавычки вокруг команды mysql после -e, и это приводит к тому, что она не работает.

E.g.

find /my/folder/ -name "*.txt" | while read i; do chop.pl $i; echo $i; done | parallel -t -N 2 mysql -h localhost -uuser -pxxxxxxx --local-infile=1 -D dbname -e "LOAD DATA LOCAL INFILE '{2}' IGNORE INTO TABLE tblname IGNORE 1 LINES (col1,col2,col3,col4) set col5='{1}', col6='foo'"

Команда, которую он пытается выполнить, без двойных кавычек после -e выглядит так:

mysql -h localhost -uuser -pxxxxxxx --local-infile=1 -D dbname -e LOAD DATA LOCAL INFILE '/my/file/name/yadda_yadda-12345678.txt' IGNORE INTO TABLE tblname IGNORE 1 LINES (col1,col2,col3,col4) set col5='yadda_yadda', col6='foo'

Есть идеи, как добавить двойные кавычки после -e?


person 719016    schedule 17.09.2015    source источник


Ответы (2)


Ленивый и эффективный способ: поместите команду mysql в функцию, затем пусть parallel вызовет ее, передав {1} и {2}.

На самом деле использование функций предлагается на параллельных страницах руководства:
https://www.gnu.org/software/parallel/man.html#QUOTING

person Mr. Llama    schedule 17.09.2015

Отвечая на мой собственный вопрос, решение заключалось в том, чтобы избежать двойных кавычек, одинарных кавычек и скобок:

find /my/folder/ -name "*.txt" | while read i; do chop.pl $i; echo $i; done | parallel -t -N 2 mysql -h localhost -uuser -pxxxxxxx --local-infile=1 -D dbname -e \"LOAD DATA LOCAL INFILE \'{2}\' IGNORE INTO TABLE tblname IGNORE 1 LINES \(col1,col2,col3,col4\) set col5=\'{1}\', col6=\'foo\'\"

person 719016    schedule 17.09.2015