根据文件内容替换一行

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>startvarothervar,只是为了展示它们的工作原理。

   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 但我使用 7s 代替,因此如果您愿意,可以将其用作 awk 'script' file