我有一个文件,其中第二列包含时间戳和日期。如果该行包含其中一个单词,则需要将其替换为如下所示。
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 脚本格式。