Como posso reformatar dados tabulares usando o AWK?

1

Eu tenho um arquivo contendo a seguinte saída.

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

Eu quero formatar este arquivo da seguinte maneira, mas eu quero usar shell script apenas, acredito que podemos usar o awk, mas eu não tenho lógica

abc  abc1  ONLINE serverA
abc  abc2  ONLINE serverB
xyz  xyz1  ONLINE serverA
xyz  xyz2  ONLINE serverB
xyz  xyz3  ONLINE serverC
    
por Satish 20.09.2013 / 20:58

2 respostas

5

Isso pode ser uma abordagem:

$ 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

Explicação

  • /^ora/ aplica-se às linhas que começam com ora . Nesses, split do conteúdo baseado no ponto . e armazená-lo na matriz a . Então, é a[1]=ora , a[2]=abc , ... Então next faz awk ir para a próxima linha.
  • print imprime o segundo campo da matriz a mais elementos diferentes da linha: $1 indicando a primeira, $4 indicando a quarta.
por 20.09.2013 / 21:07
4

Um script ligeiramente expandido (mas amplamente equivalente):

{
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
  }
}

Coloque isso em um arquivo server.awk , e se sua entrada estiver em log.txt , invoque-a com

awk -f server.awk log.txt

Espero que a explicação acrescente algum valor ...

    
por 20.09.2013 / 21:35