Correspondência de padrões multilinha e linhas de exclusão - sed / awk / grep

0

Input.txt

-------
Database alias = ABC
Node name = node01
Hostname = hostnode01
Service name = 12345
-------
Hostname    = hostnode01
Service name    = 12345
-------
Database alias  = PQR
Node name   = node01
Hostname    = hostnode01
Service name    = 12345
-------
Hostname    = hostnode01
Service name    = 12345
-------
Database alias  = XYZ ......

Saída esperada

-------
Database alias  = ABC
Node name   = node01
Hostname    = hostnode01
Service name    = 12345
-------
Database alias  = PQR
Node name   = node01
Hostname    = hostnode01
Service name    = 12345
-------
Database alias  = XYZ ......

A ideia é remover os valores duplicados do nome do host & Nome do serviço se repetitivo ou você pode dizer Remova as linhas entre '------- ', se houver duas linhas entre elas.

Tentei usar sed com múltipla correspondência, mas não obtive o desejado o / p

sed '/-------/{$!N;/\n.*Hostname/d;}' Input.txt
    
por user44 27.03.2018 / 20:04

2 respostas

0

Este não é um trabalho para sed (você não deve depender das entradas duplicadas serem consecutivas). Use awk :

  1. Defina o separador de registro como regex ^-+$ .

  2. Use uma matriz associativa, em que o índice é uma concatenação de HostName e ServiceName. Para qualquer leitura de registro, coloque o registro na matriz apenas se ainda não existir.

  3. Ao final do processamento do arquivo, imprima todos os elementos da matriz, formatados em linhas separadas, com suas linhas ---- delimitador.

por 27.03.2018 / 20:28
0

Abordagem do awk do GNU:

awk 'BEGIN{ 
         RS = ORS = "-------\n";
         pat = "^Hostname += ([^ ]+)\nService name += ([^ ]+)\n$";  
     }
     NR == FNR{ 
         if (match($0, pat, a)) { items[a[1], a[2]]++ } 
         next 
     }
     match($0, pat, a) && (a[1], a[2]) in items \
     && items[a[1], a[2]] > 1{ next }1' inout.txt input.txt

A saída:

-------
Database alias = ABC
Node name = node01
Hostname = hostnode01
Service name = 12345
-------
Database alias  = PQR
Node name   = node01
Hostname    = hostnode01
Service name    = 12345
-------
Database alias  = XYZ ......
-------
    
por 27.03.2018 / 22:34