如何在 AWK 中拆分拆分字段?

How can I split a splited field in AWK?

我正在开发一个脚本,该脚本必须采用以下格式的文本文件: field1@field2@20200101133030@field4 我需要将其转换为 sql 插入命令。出色地。第三个字段是日期。我有一个将日期转换为 to_date('2020/01/01:13:30:30', 'yyyy/mm/dd:hh24:mi:ss'),

的脚本
funcion(){
        echo  | nawk -v s1="7" -v firstPart="to_date(" -v lastPart="yyyy/mm/dd:hh24:mi:ss" '
                {
                        print firstPart s1 substr([=10=],1,4) "/" substr([=10=],5,2) "/" substr([=10=],7,2)":"\
                        substr([=10=],9,2)":"substr([=10=],11,2)":"substr([=10=],13,2) s1 ", " s1\
                        lastPart s1 ")"
                }'
}

我还有另一个脚本将整行拆分为插入命令:

createInsert(){
        echo  | awk -F'@' '{
        printf "INSERT INTO myTable VALUES (\x27%s\x27,\x27%s\x27,\x27%s\x27,\x27%s\x27,\x27%s\x27,\x27%s\x27,\x27%s\x27);",,,,,,,;print ""
        }'
}

没问题。输出:

INSERT INTO myTable VALUES ('0000000','D00','20200901131010','20200917133115','20200917142400','20200923120401','N');

我的问题是我需要使用下面的函数转换 $3、$4 和 $5 字段。但我认为 awk 不允许调用另一个函数,例如

createInsert(){
        echo  | awk -F'@' '{
        printf "INSERT INTO myTable VALUES (\x27%s\x27,\x27%s\x27,\x27%s\x27,\x27%s\x27,\x27%s\x27,\x27%s\x27,\x27%s\x27);",,,**$(funcion )**,,,,;print ""
        }'
}

是否有任何形式可以创建一个单独的方法来拆分字段 $3、4 和 5,并执行与其他函数相同的操作(将其创建到 toDate 函数中)

谢谢,希望得到您的答复。

总结: 输入:

`"0000000@D01@000000@20200910103010@20200910111111@20200910100403@N@"` 

输出:

INSERT INTO myTable VALUES ('0000000','D01','000000','to_date('2020/09/10:10:30:10', 'yyyy/mm/dd:hh24:mi:ss')',''to_date('2020/09/11:11:11:11', 'yyyy/mm/dd:hh24:mi:ss')','to_date('2020/10/10:04:03', 'yyyy/mm/dd:hh24:mi:ss')','N');

能否请您尝试以下操作,这完全基于 GNU awk 中显示的 OP 示例。如果您的字段编号与显示的示例不同,请尝试更改解决方案中的字段编号,它应该适合您,我还认为您显示的值 7243176 我们需要硬编码,如果不是这种情况,那么您可以将各自的在那里获取它的字段编号。

awk -v s1="'" '
BEGIN{
  FS="@"
  OFS="7, 7"
}
{
  print "INSERT INTO myTable VALUES(77243176",,,\
  "to_date(7" substr(,1,4)"/"substr(,5,2)"/"\
  substr(,7,2)":"substr(,9,2)":"substr(,11,2)":"\
  substr(,13,2),"yyyy/mm/dd:hh24:mi:ss7)","\
  to_date(7" substr(,1,4)"/"substr(,5,2)"/"\
  substr(,7,2)":"substr(,9,2)":"substr(,11,2)\
  ":"substr(,13,2),"yyyy/mm/dd:hh24:mi:ss7)\
  " ",7N7)"
}
'  Input_file

同时考虑到 " 不是您的示例输入的一部分,以防万一您可以使用 sub 函数在 awk 程序的主块中替换它。