根据文件内容更改单词

根据文件内容更改单词

我有一个文件,其中第二列包含时间戳和日期。如果该行包含其中一个单词,则需要将其替换为如下所示。

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 执行,那么我将得到输出,但如果我使用 else 条件,那么我将收到错误。

awk '{if ($2=="timestamp") {$3="dataformat("; }; print $3 $1 ",'\''YYYY-MM-DD HH'\:'NN'\:'SS'\.'sss)" else ($2=="date") {$3="dataformat("; }; print $3 $1 ",'\''YYYY-MM-DD)" }' test.out 

错误:

awk: {if ($2=="timestamp") {$3="dataformat("; }; print $3 $1 ",'YYYY-MM-DD HH:NN:SS.sss)" else ($2=="date") {$3="dataformat("; }; print $3 $1 ",'YYYY-MM-DD)" }
awk: ^ syntax error

答案1

我会写:

awk -v q="'" '
    $2 == "timestamp" { $0 = sprintf("dateformat(%s, "q"YYYY-MM-DD HH:NN:SS.sss"q")", $1) }
    $2 == "date"      { $0 = sprintf("dateformat(%s, "q"YYYY-MM-DD"q")", $1) }
                      { print }
' file

答案2

让我先将您的命令换行:

awk '
    {
        if ($2=="timestamp") {
            $3="dataformat("; 
        };
        print $3 $1 ",'\''YYYY-MM-DD HH'\:'NN'\:'SS'\.'sss)"
        else ($2=="date") {
            $3="dataformat("; 
        };
        print $3 $1 ",'\''YYYY-MM-DD)"
    }
' test.out 

因此,有两个问题,一是else子句与子句不一致if(子句外面有一个print命令),二是子句else不接受条件,而您想使用条件else if

那么也许这正是我们的意图?

awk '
    {
        if ($2=="timestamp") {
            $3="dataformat("
            print $3 $1 ",'\''YYYY-MM-DD HH'\:'NN'\:'SS'\.'sss)"
        } else if ($2=="date") {
            $3="dataformat("
            print $3 $1 ",'\''YYYY-MM-DD)"
        }
    }
' test.out 

也不确定您想对不匹配的其他行做什么...您可以else在末尾添加一个执行简单操作print(默认打印未修改的行),或者可能是print特定字段的操作。

请注意,格式有助于查看块的嵌套方式!这是完全有效的语法,shell 可以很好地接受多行单引号字符串,并且 awk 也会对它们非常满意。我建议您使用更易读的 awk 脚本格式。

相关内容