Se você está precisando de explicação, diga-me e adicionarei comentários no código.
Requisitos:
- O número de campos e valores deve corresponder.
- Nomes de campo e valores de campo não devem conter esses caracteres:
,)(;
- vírgula, parênteses, ponto-e-vírgula.
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
Explicação:
Esta string é escolhida como exemplo: INSERT INTO table1(field1,field2,field3) VALUES('values1','value2','value3');
-
%código%
-
num = patsplit($3$4, arr, /[^,)(;]+/);
- divida a string s na matriz a na expressão regular r e retorne o número de campos.
-
patsplit(s, a, r)
- $3$4
é $3
, table1(field1,field2,field3)
é $4
. Então, após a concatenação, temos essa string: VALUES('values1','value2','value3');
.
- , divida-o em
table1(field1,field2,field3)VALUES('values1','value2','value3');
por esse regex arr
. Isso significa: todos os caracteres, exceto vírgula, parênteses, ponto-e-vírgula. Portanto, agora: /[^,)(;]+/
é arr[1]
, table1
é arr[2]
, field1
é arr[5]
, e assim por diante.
-
VALUES
para o algoritmo usado neste script, a metade da variável num /= 2;
é necessária.
-
num
- imprime o primeiro elemento do printf("SELECT * FROM %s WHERE ", arr[1]);
, que é o nome da tabela. No nosso caso, é o arr
.
-
table1
- o algoritmo. Imprima um elemento da primeira metade do printf("%s=%s", arr[i], arr[num + i]);
e elemento correspondente da segunda metade do arr
. Ou seja, arr
e arr[2]
, arr[6]
e arr[3]
, arr[7]
e arr[4]
.
-
arr[8]
- O operador ternário. Se não for a última iteração, imprima printf (i < num) ? " AND " : ";\n";
, senão imprima AND
(ponto-e-vírgula final e nova linha).
Entrada (eu corrijo sua entrada, porque ela tinha erros - o número de nomes de campos e de campos não correspondia).
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');
Resultado
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';