Вы просто переполнили целочисленную арифметику оболочки:
echo $(( 65536 * 65536 * 65536 * 32768 - 1 ))
9223372036854775807
echo $(( 65536 * 65536 * 65536 * 32768 ))
-9223372036854775808
Вы можете использовать инструмент произвольной точности, такой как bc
для этого
bc
3*3*3*17*433*613*937*858164002128703934431
97964999429910939982995739699617
Или
echo '3*3*3*17*433*613*937*858164002128703934431' | bc
97964999429910939982995739699617
КомплексAWK
раствор:
awk -F'[()]' '{ sub(/INSERT INTO */,"",$1);
printf "SELECT * FROM %s WHERE ",$1;
len=split($2, f, ","); split($4, v, ",");
for (i=1; i<=len; i++) printf "%s=%s%s", f[i], v[i], (i==len? ";":" AND ");
print ""
}' test_inserts
-F'[()]'
-разделитель сложных полей sub(/INSERT INTO */,"",$1)
-удалить INSERT INTO
фразу из 1-го поля (для извлечения таблицы имя)printf "SELECT * FROM %s WHERE ",$1
-напечатать начало оператора SQL, содержащего имя таблицы split($2, f, ",")
-разделить второе поле с помощью разделителя ,
для получения имен полей(f
становится массивом имен полей)split($4, v, ",")
-разделить 4-е поле разделителем ,
для получения значений поля(v
становится массивом значений полей)Выход:
SELECT * FROM table1 WHERE field1='values1' AND field2='value2' AND field3='value3';
SELECT * FROM table1 WHERE field1='other_values1' AND field2='other_value2' AND field3='other_value3';
SELECT * FROM table1 WHERE field1='another_values1' AND field2='another_value2' AND field3='another_value3';
SELECT * FROM table2 WHERE table2_field1='table2_values1' AND table2_field2='table2_value2' AND table2_field3='table2_value3' AND field4=;
SELECT * FROM table2 WHERE table2_field1='other_table2_values1' AND table2_field2='other_table2_value2' AND table2_field3='other_table2_value3' AND table2_field4=;
SELECT * FROM table2 WHERE table2_field1='another_table2_values1' AND table2_field2='another_table2_value2' AND table2_field3='another_table2_value3' AND table2_field4='another_table2_value4';
Если вам нужны пояснения, скажите, и я добавлю комментарии в код.
Требования:
,)(;
-запятая, круглые скобки, точка с запятой. gawk '{
num = patsplit($3$4, arr, /[^,)(;]+/);
num /= 2;
printf("SELECT * FROM %s WHERE ", arr[1]);
for(i = 2; i <= num; i++) {
printf("%s=%s", arr[i], arr[num + i]);
printf (i < num) ? " AND " : ";\n";
}
}' input.txt
Пояснение:
Эта строка выбрана в качестве примера:INSERT INTO table1(field1,field2,field3) VALUES('values1','value2','value3');
num = patsplit($3$4, arr, /[^,)(;]+/);
patsplit(s, a, r)
-разделяет строку s на массив a по регулярному выражению r и возвращает количество полей. $3$4
-$3
— это table1(field1,field2,field3)
, $4
— это VALUES('values1','value2','value3');
. Итак, после объединения у нас есть эта строка:table1(field1,field2,field3)VALUES('values1','value2','value3');
. arr
этим регулярным выражением /[^,)(;]+/
. Это означает :все символы, кроме запятой, круглых скобок и точки с запятой. Следовательно, теперь:arr[1]
— это table1
, arr[2]
— это field1
, arr[5]
— это VALUES
и так далее. num /= 2;
для алгоритма, используемого в этом скрипте, требуется половина переменной num
. printf("SELECT * FROM %s WHERE ", arr[1]);
-напечатать первый элемент arr
, который является именем таблицы. В нашем случае это table1
. printf("%s=%s", arr[i], arr[num + i]);
-Алгоритм. Выведите один элемент из первой половины arr
и соответствующий элемент из второй половины arr
. То есть arr[2]
и arr[6]
, arr[3]
и arr[7]
, arr[4]
и arr[8]
. printf (i < num) ? " AND " : ";\n";
-Тернарный оператор. Если это не последняя итерация, выведите AND
, иначе выведите;\n
(последнюю точку с запятой и новую строку ). Ввод(Я исправил ваш ввод, так как в нем были ошибки -количество имен полей и значений полей не совпадали ).
INSERT INTO table1(field1,field2,field3) VALUES('values1','value2','value3');
INSERT INTO table1(field1,field2,field3) VALUES('other_values1','other_value2','other_value3');
INSERT INTO table1(field1,field2,field3) VALUES('another_values1','another_value2','another_value3');
INSERT INTO table2(table2_field1,table2_field2,table2_field3,table2_field4) VALUES('table2_values1','table2_value2','table2_value3','table2_value4');
INSERT INTO table2(table2_field1,table2_field2,table2_field3,table2_field4) VALUES('other_table2_values1','other_table2_value2','other_table2_value3','other_table2_value4');
INSERT INTO table2(table2_field1,table2_field2,table2_field3,table2_field4) VALUES('another_table2_values1','another_table2_value2','another_table2_value3','another_table2_value4');
Выход
SELECT * FROM table1 WHERE field1='values1' AND field2='value2' AND field3='value3';
SELECT * FROM table1 WHERE field1='other_values1' AND field2='other_value2' AND field3='other_value3';
SELECT * FROM table1 WHERE field1='another_values1' AND field2='another_value2' AND field3='another_value3';
SELECT * FROM table2 WHERE table2_field1='table2_values1' AND table2_field2='table2_value2' AND table2_field3='table2_value3' AND table2_field4='table2_value4';
SELECT * FROM table2 WHERE table2_field1='other_table2_values1' AND table2_field2='other_table2_value2' AND table2_field3='other_table2_value3' AND table2_field4='other_table2_value4';
SELECT * FROM table2 WHERE table2_field1='another_table2_values1' AND table2_field2='another_table2_value2' AND table2_field3='another_table2_value3' AND table2_field4='another_table2_value4';