如何在 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
程序的主块中替换它。
我正在开发一个脚本,该脚本必须采用以下格式的文本文件: 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
程序的主块中替换它。