2番目の列には、タイムスタンプと日付を含むファイルがあります。行にこれらの単語のいずれかが含まれている場合は、次のように置き換える必要があります。
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
したがって、2つの問題があります。 1つは、else
句が句と一致しないことですif
(節の外にコマンドがありますprint
)。もう1つは、句が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
フォーマットすると、ブロックがどのようにネストされているかを確認するのに役立ちます。これは完全に有効な構文です。シェルは一重引用符で囲まれた複数行の文字列を受け入れ、awkはこれに完全に満足しています。より読みやすい awk スクリプト形式を使用することをお勧めします。