根据文件内容替换一行
Replace a line based upon the file content
我有一个文件,其中第二列包含时间戳和日期。如果该行包含单词之一,则需要像下面这样替换它。感谢任何帮助。
File:
a smallint
b timestamp
c date
d varchar
O/P:
a smallint
dateformat(b,'YYYY-MM-DD HH:NN:SS.sss')
dateformat(c.'YYYY-MM-DD')
d varchar
如果我在一个单独的语句中添加 awk 那么它就可以工作但是如果我添加 if else 语句那么我会收到错误。
awk '{if (=="timestamp") {="dataformat("; }; print ",'\''YYYY-MM-DD HH'\:'NN'\:'SS'\.'sss)" else (=="date") {="dataformat("; }; print ",'\''YYYY-MM-DD)" }' test.out
Error:
awk: {if (=="timestamp") {="dataformat("; }; print ",'YYYY-MM-DD HH:NN:SS.sss)" else (=="date") {="dataformat("; }; print ",'YYYY-MM-DD)" }
awk: ^ syntax error
awk: {if (=="timestamp") {="dataformat("; }; print ",'YYYY-MM-DD HH:NN:SS.sss)" else (=="date") {="dataformat("; }; print ",'YYYY-MM-DD)" }
awk: ^ syntax error
如果您想在 awk 中使用单引号或双引号,请使用八进制表示法。
\047 - 单引号。
见下文
> cat datatype.txt
a smallint
b timestamp
c date
d varchar
> awk -F" " ' { if(~/date/) { print "dateformat("".7YYYY-MM-DD7)" } } ' datatype.txt
dateformat(c.'YYYY-MM-DD')
> awk -F" " ' { if(~/timestamp/) { print "dateformat("",7YYYY-MM-DD HH:NN:SS.sss7)" } } ' datatype.txt
dateformat(b,'YYYY-MM-DD HH:NN:SS.sss')
>
当您尝试缩进代码时(在 awk
中,您可以在单引号之间使用换行符),您会看到 else
之前有一个 print
。
awk '{
if (=="timestamp") {
="dataformat(";
};
print ",'\''YYYY-MM-DD HH'\:'NN'\:'SS'\.'sss)"
else
(=="date") {
="dataformat(";
};
print ",'\''YYYY-MM-DD)"
}' test.out
此代码可以"fixed"与
awk '{
if (=="timestamp") {
="dataformat(";
print ",'\''YYYY-MM-DD HH'\:'NN'\:'SS'\.'sss)"
}
if (=="date") {
="dataformat(";
print ",'\''YYYY-MM-DD)"
}
}' test.out
你看你不需要else语句。
现在更多的问题出现了。您不应该使用 </code> 作为变量,只需创建一个新变量即可。<br>
可以在 BEGIN {} 部分或正常流程中将变量设置为 awk 参数。<br>
我会使用带有单引号的变量参数。我还介绍了 <code>startvar
和 othervar
,只是为了展示它们的工作原理。
awk -v ymd="'YYYY-MM-DD'" \
-v dt="'YYYY-MM-DD HH:NN:SS.sss'" \
'
BEGIN {
startvar="Example variable"
}
=="timestamp" {
printf("%s, dateformat(%s)\n", , ymd);
othervar=startvar" expanded";
print othervar;
}
=="date" {
printf("%s, dateformat(%s)\n", , dt);
}
' test.out
如果没有带有附加变量的演示部分并删除一些换行符,您会得到
awk -v ymd="'YYYY-MM-DD'" -v dt="'YYYY-MM-DD HH:NN:SS.sss'" '
=="timestamp" { printf("%s, dateformat(%s)\n", , ymd); }
=="date" { printf("%s, dateformat(%s)\n", , dt); }
' test.out
$ cat tst.awk
BEGIN {
fmt["timestamp"] = "dateformat(%s,7YYYY-MM-DD HH:NN:SS.sss7)"
fmt["date"] = "dateformat(%s.7YYYY-MM-DD7)"
}
in fmt { [=10=] = sprintf(fmt[],) }
{ print }
$ awk -f tst.awk file
a smallint
dateformat(b,'YYYY-MM-DD HH:NN:SS.sss')
dateformat(c.'YYYY-MM-DD')
d varchar
由于脚本在一个文件中,我本可以使用文字 '
s 但我使用 7
s 代替,因此如果您愿意,可以将其用作 awk 'script' file
。
我有一个文件,其中第二列包含时间戳和日期。如果该行包含单词之一,则需要像下面这样替换它。感谢任何帮助。
File:
a smallint
b timestamp
c date
d varchar
O/P:
a smallint
dateformat(b,'YYYY-MM-DD HH:NN:SS.sss')
dateformat(c.'YYYY-MM-DD')
d varchar
如果我在一个单独的语句中添加 awk 那么它就可以工作但是如果我添加 if else 语句那么我会收到错误。
awk '{if (=="timestamp") {="dataformat("; }; print ",'\''YYYY-MM-DD HH'\:'NN'\:'SS'\.'sss)" else (=="date") {="dataformat("; }; print ",'\''YYYY-MM-DD)" }' test.out
Error:
awk: {if (=="timestamp") {="dataformat("; }; print ",'YYYY-MM-DD HH:NN:SS.sss)" else (=="date") {="dataformat("; }; print ",'YYYY-MM-DD)" }
awk: ^ syntax error
awk: {if (=="timestamp") {="dataformat("; }; print ",'YYYY-MM-DD HH:NN:SS.sss)" else (=="date") {="dataformat("; }; print ",'YYYY-MM-DD)" }
awk: ^ syntax error
如果您想在 awk 中使用单引号或双引号,请使用八进制表示法。 \047 - 单引号。 见下文
> cat datatype.txt
a smallint
b timestamp
c date
d varchar
> awk -F" " ' { if(~/date/) { print "dateformat("".7YYYY-MM-DD7)" } } ' datatype.txt
dateformat(c.'YYYY-MM-DD')
> awk -F" " ' { if(~/timestamp/) { print "dateformat("",7YYYY-MM-DD HH:NN:SS.sss7)" } } ' datatype.txt
dateformat(b,'YYYY-MM-DD HH:NN:SS.sss')
>
当您尝试缩进代码时(在 awk
中,您可以在单引号之间使用换行符),您会看到 else
之前有一个 print
。
awk '{
if (=="timestamp") {
="dataformat(";
};
print ",'\''YYYY-MM-DD HH'\:'NN'\:'SS'\.'sss)"
else
(=="date") {
="dataformat(";
};
print ",'\''YYYY-MM-DD)"
}' test.out
此代码可以"fixed"与
awk '{
if (=="timestamp") {
="dataformat(";
print ",'\''YYYY-MM-DD HH'\:'NN'\:'SS'\.'sss)"
}
if (=="date") {
="dataformat(";
print ",'\''YYYY-MM-DD)"
}
}' test.out
你看你不需要else语句。
现在更多的问题出现了。您不应该使用 </code> 作为变量,只需创建一个新变量即可。<br>
可以在 BEGIN {} 部分或正常流程中将变量设置为 awk 参数。<br>
我会使用带有单引号的变量参数。我还介绍了 <code>startvar
和 othervar
,只是为了展示它们的工作原理。
awk -v ymd="'YYYY-MM-DD'" \
-v dt="'YYYY-MM-DD HH:NN:SS.sss'" \
'
BEGIN {
startvar="Example variable"
}
=="timestamp" {
printf("%s, dateformat(%s)\n", , ymd);
othervar=startvar" expanded";
print othervar;
}
=="date" {
printf("%s, dateformat(%s)\n", , dt);
}
' test.out
如果没有带有附加变量的演示部分并删除一些换行符,您会得到
awk -v ymd="'YYYY-MM-DD'" -v dt="'YYYY-MM-DD HH:NN:SS.sss'" '
=="timestamp" { printf("%s, dateformat(%s)\n", , ymd); }
=="date" { printf("%s, dateformat(%s)\n", , dt); }
' test.out
$ cat tst.awk
BEGIN {
fmt["timestamp"] = "dateformat(%s,7YYYY-MM-DD HH:NN:SS.sss7)"
fmt["date"] = "dateformat(%s.7YYYY-MM-DD7)"
}
in fmt { [=10=] = sprintf(fmt[],) }
{ print }
$ awk -f tst.awk file
a smallint
dateformat(b,'YYYY-MM-DD HH:NN:SS.sss')
dateformat(c.'YYYY-MM-DD')
d varchar
由于脚本在一个文件中,我本可以使用文字 '
s 但我使用 7
s 代替,因此如果您愿意,可以将其用作 awk 'script' file
。