gnu parallel mysql LOAD DATA LOCAL INFILE

时间:2015-09-17 16:27:05

标签: mysql gnu-parallel

我正在尝试使用GNU parallel执行几个LOAD DATA LOCAL INFILE mysql命令,其中:

  • {1}是我从UNIX查找命令管道
  • 获取的文件的名称
  • {2}chop.pl脚本根据某些规则从文件字符串中打印出某个令牌的结果

似乎我以正确的方式调用GNU并行,除了它 之后不会在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之后添加双引号的任何想法?

2 个答案:

答案 0 :(得分:1)

懒惰有效的方法:将mysql命令放入函数中,然后parallel调用它,传递{1}{2}

并行手册页实际上建议使用函数:
https://www.gnu.org/software/parallel/man.html#QUOTING

答案 1 :(得分:0)

回答我自己的问题,解决办法是逃避所有双引号,单引号和括号标记:

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\'\"