2012-02-14 5 views
1

У меня есть CSV-файл содержит список номеров,MySQL петля скрипт Баш

479856252|1329148400996|1329148405406|1329148412444|0|6042292534|6042292534|14016487697|0|6 
479856262|1329148401487|1329148405287|1329148412444|0|6136992594|6136992594|14016487697|0|6 
479856272|1329148405124|1329148405124|1329148412470|0|8883398128||4016487697|0||P|0|7 
479856282|1329148114930|1329148117966|1329148412502|0|8006564132|8779918502|7657954163|2609 

когда я awk -F'|' '{print $1;}' file.csv > file2.csv

Я получаю следующие идентификаторы таблиц

12345 
67891 
32234 
22345 
12345 

У меня есть цикл который работает следующим образом

for i in `cat file2.cvs` 
do 
DELETE FROM TABLE1 WHERE ID = $i 
done 

, однако это создает большую нагрузку на мой ящик, я надеюсь, что я мог бы разделить операцию (для каждых 100 записей из файла file2.csv) выполнить удаление, а затем спящий на 1 секунду, оставшиеся значения до конца файла ,

Ваша помощь очень ценится.

Спасибо

+0

Можете ли вы показать, что у вас есть до сих пор? – Dan

+0

Правильно ли я понимаю вас, если вы хотите запустить что-то вроде 'УДАЛИТЬ ОТ mytable WHERE ID IN (12345,67891, ...)' в блоках по 100 идентификаторов каждый? –

+7

Вам было бы лучше загружать их во временную таблицу в mysql за один раз, а затем использовать это как источник идентификаторов для удаления, вместо того, чтобы уклоняться от awk/perl/bash. –

ответ

-1

Вместо того, чтобы спать в течение 1 секунды после каждых 100 удалений, вы можете сохранить существующую структуру файла и просто спать в течение 0,01 секунд после каждого удаления, чтобы достичь в основном то же самое.

Что-то вроде этого:

for i in `cat file2.cvs` 
do 
    mysql -e "DELETE FROM TABLE1 WHERE ID = ${i};" 
    sleep .01 
done 
0

это сделать в одной команде SQL:

DELETE FROM TABLE1 WHERE ID in (`cat file2.cvs | tr '\n' ','` -1) 

-1 в конце концов, чтобы обслужить Запятая. Если у вашего входного файла нет строки в последней строке, вам не понадобится -1.

-1

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

j=0 
for i in `cat file2.cvs` 
do 

    if [ $j -eq 100 ] 
    then 
     sleep 1 
     j=0 
    fi   

    j=$[ j+1 ] 
done 
Смежные вопросы