gpt4 book ai didi

csv - 如何在 awk 脚本中传递命令行参数

转载 作者:行者123 更新时间:2023-12-04 01:12:29 24 4
gpt4 key购买 nike

以前有人问过这种类型的问题,但不完全是这个问题。我是 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 表名作为命令行参数。我希望从命令行参数中获得它,而不是对 DATA 进行硬编码。

我尝试运行它,因为上面的 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_nameawk: ./sql.awk:19: printf("INSERT INTO %s VALUES ( %s );\n",tableName, head, dat) > tableName.sqlawk: ./sql.awk:19: ^ syntax errorawk: ./sql.awk:23: printf("\n-- Generated by %s at %s\n", ENVIRON["USERNAME"], strftime("%Y-%m-%d %T")) >> tableName.sqlawk: ./sql.awk:23: ^ syntax errorawk: data.csv:2: 1;Test1;36;Engineer;date '2022-10-12';50.40awk: data.csv:2: ^ invalid char ''' in expressionawk: data.csv:2: 1;Test2;36;Engineer;date '2022-10-12';50.40awk: data.csv:2: ^ syntax error

如何获取表名和输出文件名的命令行参数?

最佳答案

如果您不希望 awk 稍后将其作为文件处理,则需要在从 ARGV 数组读取值后执行 ARGC--。您可以使用:

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

关于csv - 如何在 awk 脚本中传递命令行参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64414889/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com