Como faço para formar uma nova string a partir de uma linha CSV analisada?

0

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?

    
por Dave 06.12.2017 / 22:11

3 respostas

2
awk -F ',' '{
    printf("REPLACE INTO my_table (ID, NAME, HOURS) VALUES ('\''%s'\'', '\''%s'\'', '\''%s'\'');\n", $2, $2, $3) 
}' types.csv
    
por 06.12.2017 / 22:34
1

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;--');
    
por 06.12.2017 / 22:35
0

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
    
por 06.12.2017 / 22:43