ファイルの内容に応じて単語を変更する

ファイルの内容に応じて単語を変更する

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実行するタスクを最後に追加したり、特定のフィールドにタスクを追加したりできます。printprint

フォーマットすると、ブロックがどのようにネストされているかを確認するのに役立ちます。これは完全に有効な構文です。シェルは一重引用符で囲まれた複数行の文字列を受け入れ、awkはこれに完全に満足しています。より読みやすい awk スクリプト形式を使用することをお勧めします。

関連情報