之前曾问过这种类型的问题,但并非完全如此。我是bash和awk脚本编写方面的新手。所以我不知道如何实现我的目标。
我的目标是从csv文件生成sql插入。
这是我的csv文件内容:-
ID;NAME;AGE;TITLE;DATE;SALARY
1;Test1;36;Engineer;date '2022-10-12';50.40
2;Test2;45;Manager;date '2020-01-15';100.50
我的awk脚本是sql.awk:-
#!/bin/awk -f
BEGIN {
FS=";"
OFS=","
quotation="'"
}
FNR==1 {
$1=$1; head=$0
next
}
{
dat=""
for(i=1;i<=NF;i++) {
val=($i~/[[:alpha:]]$/)?quotation $i quotation:$i
dat=(dat)?dat OFS val:val
}
printf("INSERT INTO DATA ( %s) VALUES ( %s );\n", head, dat) > "data.sql"
}
END {
print ENVIRON["strftime"]
printf("\n-- Generated by %s at %s\n", ENVIRON["USERNAME"], strftime("%Y-%m-%d %T")) >> "data.sql"
}
此脚本生成具有正确内容的文件data.sql:
INSERT INTO DATA ( ID,NAME,AGE,TITLE,DATE,SALARY) VALUES (
1,'Test1',36,'Engineer',date '2022-10-12',50.40 );
INSERT INTO DATA ( ID,NAME,AGE,TITLE,DATE,SALARY) VALUES (
2,'Test2',45,'Manager',date '2020-01-15',100.50 );
-- Generated by usr_name at 2020-10-18 17:31:13
我的目标是获取sql表名称作为命令行参数。我希望从命令行参数中获取而不是硬编码的数据。
我尝试将sript修改为:-
./ sql.awk -f data.csv gievn_table_name
#!/bin/awk -f
BEGIN {
FS=";"
OFS=","
quotation="'"
tableName=ARGV[2]
}
FNR==1 {
$1=$1; head=$0
next
}
{
dat=""
for(i=1;i<=NF;i++) {
val=($i~/[[:alpha:]]$/)?quotation $i quotation:$i
dat=(dat)?dat OFS val:val
}
printf("INSERT INTO %s VALUES ( %s );\n",tableName, head, dat) > tableName.sql
}
END {
print ENVIRON["strftime"]
printf("\n-- Generated by %s at %s\n", ENVIRON["USERNAME"], strftime("%Y-%m-%d %T")) >> tableName.sql
}
我遇到一个错误:
./ sql.awk -f data.csv gievn_table_name awk:./sql.awk:19:printf(“ INSERT INTO%s VALUES(%s); \ n”,tableName,head,dat)> tableName.sql awk:./sql.awk:19:^语法错误 awk:./sql.awk:23:printf(“ \ n--由%s在%s \ n”生成,ENVIRON [“ USERNAME”],strftime(“%Y-%m-%d%T”) )>> tableName.sql awk:./sql.awk:23:^语法错误 awk:data.csv:2:1; Test1; 36; Engineer; date'2022-10-12'; 50.40 awk:data.csv:2:表达式中的^无效char''' awk:data.csv:2:1; Test2; 36; Engineer; date'2022-10-12'; 50.40 awk:data.csv:2:^语法错误
如何获取表名和输出文件名的命令行参数?
答案 0 :(得分:4)
如果您不希望awk稍后将其作为文件处理,则需要从ARGC--
数组中读取值后执行ARGV
。您可以使用:
cat sql.awk
BEGIN {
FS=";"
OFS=","
quotation="'"
tableName=ARGV[2]
ARGC--
}
FNR==1 {
$1 = $1
head = $0
next
}
{
dat = ""
for(i=1; i<=NF; i++) {
val = ($i~/[[:alpha:]]$/) ? quotation $i quotation : $i
dat = (dat != "") ? dat OFS val : val
}
printf("INSERT INTO %s ( %s ) VALUES ( %s );\n", tableName, head, dat)
}
END {
printf("\n-- Generated by %s at %s\n", ENVIRON["USER"], strftime("%Y-%m-%d %T"))
}
要运行此命令,请使用命令:
awk -f sql.awk data.csv DATA
或者,您可以在awk命令中使用更常见的-v tableName=DATA
。