transpõe conjuntos de três linhas para colunas

1

Eu tenho um arquivo com as entradas abaixo:

[root@ovmm329 ovm_utils]# cat /tmp/disk.txt
Physical Disk : 'IBM (67) device=/dev/mapper/360050768018206483000000000000453 shareddisk=true
Physical Disk : 'IBM (58) device=/dev/mapper/36005076801820648300000000000043f shareddisk=true
Physical Disk : 'IBM (59) device=/dev/mapper/360050768018206483000000000000440 shareddisk=true
Physical Disk : 'IBM (71) device=/dev/mapper/360050768018206483000000000000497 shareddisk=true
[root@ovmm329 ovm_utils]#

Eu tentei usar o sed e o awk de todas as formas possíveis, mas não consegui colocá-lo no formato necessário. Eu gostaria de ter o arquivo neste formato:

Physical Disk  device                                          Shareddisk
IBM (67)        /dev/mapper/360050768018206483000000000000453  true
IBM (58)        /dev/mapper/36005076801820648300000000000043f  true
IBM (59)        /dev/mapper/360050768018206483000000000000440  true
IBM (71)        /dev/mapper/360050768018206483000000000000497  true
    
por IgniteLX 27.01.2016 / 20:02

1 resposta

2

Usando variáveis awk e várias correspondências, você pode ler cada linha, armazenar o que precisa e depois imprimir na última partida e começar de novo.

#!/usr/bin/awk -f

BEGIN {
  DISK=""
  DEVICE=""
  FS=" : "
  print "Physical Disk\tdevice\t\t\t\t\t\tShareddisk"
  }

/Physical Disk/ {
  DISK=$2
  FS="="
}

/device/ {
  DEVICE=$2
}

/shareddisk/ {
  print DISK "\t" DEVICE "\t" $2
  FS=" : "
  }

Em seguida, execute o script no seu arquivo awk -f ./script.awk ./disk.txt

$ awk -f ./parse.awk ./disk.txt
Physical Disk   device                                          Shareddisk
'IBM (67)       /dev/mapper/360050768018206483000000000000453   true
'IBM (58)       /dev/mapper/36005076801820648300000000000043f   true
'IBM (59)       /dev/mapper/360050768018206483000000000000440   true
'IBM (71)       /dev/mapper/360050768018206483000000000000497   true

Para dividir o script, ele começa com um bloco BEGIN que é executado no início. Ele define algumas variáveis e define o separador de campo FS e imprime o cabeçalho. A primeira correspondência é para Physical Disk e armazena o nome do disco em uma variável. O Separador de Campo é alterado para = , pois as linhas Dispositivo e Disco Compartilhado usam = . Quando a linha correspondente a /shareddisk/ é atingida, as variáveis são impressas e o Separador de Campos é alterado novamente para corresponder à próxima linha do Disco Físico.

Editar

Isso pressupõe que o formato do arquivo seja:

cat disk.txt
Physical Disk : 'IBM (67)
  device=/dev/mapper/360050768018206483000000000000453
  shareddisk=true
Physical Disk : 'IBM (58)
  device=/dev/mapper/36005076801820648300000000000043f
  shareddisk=true
Physical Disk : 'IBM (59)
  device=/dev/mapper/360050768018206483000000000000440
  shareddisk=true
Physical Disk : 'IBM (71)
  device=/dev/mapper/360050768018206483000000000000497
  shareddisk=true
    
por 27.01.2016 / 20:22