
私はbashシェルを使用しています。各行のトークンがカンマで区切られたCSVファイルがあります。 2番目と3番目の列を取得して新しい文字列(SQL文)を作成したいと思います。私はこれを達成するためにawkを使用できると考えてみました...
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
しかし、ご覧のようにエラーが発生します。何か抜けましたか? CSVファイルの各行に新しい文字列を設定するには?
答え1
awk -F ',' '{
printf("REPLACE INTO my_table (ID, NAME, HOURS) VALUES ('\''%s'\'', '\''%s'\'', '\''%s'\'');\n", $2, $2, $3)
}' types.csv
答え2
一重引用符で囲まれた文字列に一重引用符を入れるのは本当に面倒です。ここでは、awk変数 "q"に一重引用符を渡します。私も世話をしようとしています。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;--');
答え3
おそらく最も効率的なソリューションではありませんが、うまくいくはずです。
awk -F, '{print "REPLACE INTO my_table (ID, NAME, HOURS) VALUES (\x27"$2"\x27,\x27"$2"\x27,\x27"$3"\x27);"}' types.csv