구문 분석된 CSV 행에서 새 문자열을 구성하는 방법은 무엇입니까?

구문 분석된 CSV 행에서 새 문자열을 구성하는 방법은 무엇입니까?

나는 bash 쉘을 사용하고 있습니다. 각 행의 토큰이 쉼표로 구분된 CSV 파일이 있습니다. 두 번째와 세 번째 열을 가져와서 새 문자열(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

관련 정보