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

时间:2020-10-18 15:10:19

标签: csv awk

之前曾问过这种类型的问题,但并非完全如此。我是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:^语法错误

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

1 个答案:

答案 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