awk -F ',' '{
printf("REPLACE INTO my_table (ID, NAME, HOURS) VALUES ('\''%s'\'', '\''%s'\'', '\''%s'\'');\n", $2, $2, $3)
}' types.csv
Estou usando o shell bash. Eu tenho um arquivo CSV no qual os tokens de cada linha são separados por vírgulas. Eu quero tomar a segunda e terceira colunas e forma nova seqüência fora deles (uma instrução SQL). Eu pensei que eu poderia usar o awk para esse propósito, então eu tentei ...
localhost:mydir davea$ awk -F ',' -v OFS=',' "REPLACE INTO my_table (ID, NAME, HOURS) VALUES ('$2', '$2', '$3');" types.csv
awk: syntax error at source line 1
context is
REPLACE INTO my_table >>> (ID, <<<
awk: bailing out at source line 1
mas, como você pode ver, estou recebendo um erro. Estou deixando algo de fora? Como faço para formar minha nova string de cada linha no arquivo CSV?
Colocar aspas simples dentro de uma única string entre aspas é realmente tedioso. Aqui, estou passando uma única citação para a variável awk "q". Eu também estou tentando cuidar de injeção de SQL .
awk -F ',' -v q="'" '
{
for (i=1; i<=NF; i++) gsub(q, q q, $i)
print "REPLACE INTO my_table (ID, NAME, HOURS) VALUES (" q $1 q "," q $2 q "," q $3 q");"
}
' <<END
foo,bar,Robert');DROP TABLE students;--
END
REPLACE INTO my_table (ID, NAME, HOURS) VALUES ('foo','bar','Robert'');DROP TABLE students;--');
Pode não ser a solução mais eficiente, mas deve funcionar:
awk -F, '{print "REPLACE INTO my_table (ID, NAME, HOURS) VALUES (\x27"$2"\x27,\x27"$2"\x27,\x27"$3"\x27);"}' types.csv
Tags bash awk csv shell-script