AWKを使用して表形式データの形式を再指定するには?

AWKを使用して表形式データの形式を再指定するには?

次の出力を含むファイルがあります。

ora.abc.db
      1        ONLINE  ONLINE       serverA              Open
      2        ONLINE  ONLINE       serverB              Open
ora.xyz.db
      1        ONLINE  ONLINE       serverA              Open
      2        ONLINE  ONLINE       serverB              Open
      2        ONLINE  ONLINE       serverC              Open

このファイルの形式を次のように指定したいのですが、使用したいと思いますshell script。 awkが使えると思いますが、ロジックはありません。

abc  abc1  ONLINE serverA
abc  abc2  ONLINE serverB
xyz  xyz1  ONLINE serverA
xyz  xyz2  ONLINE serverB
xyz  xyz3  ONLINE serverC

答え1

これは次の方法です。

$ awk '/^ora/ {split($0,a,"."); next} {print a[2], a[2]$1, $2, $4}' a
abc abc1 ONLINE serverA
abc abc2 ONLINE serverB
xyz xyz1 ONLINE serverA
xyz xyz2 ONLINE serverB
xyz xyz2 ONLINE serverC

説明する

  • /^ora/で始まる行に適用されますora。ここでsplitコンテンツはポイントに基づいており、.配列に保存されますa。だからa[1]=ora、、a[2]=abc...と次の行にnextジャンプします。awk
  • print配列の2番目のフィールドaと行の他の要素を印刷します。$1最初のフィールドを宣言し、$44番目のフィールドを宣言します。

答え2

少し拡張されていますが、基本的には同等のスクリプト:

{
if($0 ~ /^ora/)  {         # look for lines starting (^) with "ora"
    split($0, temp, ".");  # find the elements of the line an put in array
    serverName = temp[2];  # the "middle bit" - what was found between two dots
    next;                  # nothing else to do with this line
  }
else  {
    print serverName, serverName$1, $3, $4; # string together the bits
    # note that each $n corresponds to the nth "word"
    # by default fields are separated by white space
    # you can set the variable FS to something else (e.g. FS=",")
    # to deal with other formate
  }
}

ファイルに入れてserver.awk入力がある場合は、log.txt次のように呼び出します。

awk -f server.awk log.txt

説明が価値を加えてくれることを願っています。

関連情報