Awk compara a corrente com a próxima

0

Meu arquivo de entrada é:

     puloto_cluster_b_02_sys
puloto_cluster_b_02_sys puloto_cluster_b_generic_cg
        puloto_cluster_b_02_temp
        puloto_cluster_b_04_sys
puloto_cluster_b_04_sys puloto_cluster_b_generic_cg
        puloto_cluster_b_04_temp
        puloto_cluster_b_06_sys
puloto_cluster_b_06_sys puloto_cluster_b_generic_cg
        puloto_cluster_b_08_sys
puloto_cluster_b_08_sys puloto_cluster_b_generic_cg
        puloto_cluster_b_10_sys
puloto_cluster_b_10_sys puloto_cluster_b_generic_cg

Eu quero minha saída assim:

puloto_cluster_b_02_sys puloto_cluster_b_generic_cg
puloto_cluster_b_02_temp
puloto_cluster_b_04_sys puloto_cluster_b_generic_cg
puloto_cluster_b_04_temp
puloto_cluster_b_06_sys puloto_cluster_b_generic_cg
puloto_cluster_b_08_sys puloto_cluster_b_generic_cg
puloto_cluster_b_10_sys puloto_cluster_b_generic_cg

Isso é comparar o registro atual ($ 1) com o próximo registro ($ 1) e imprimir somente o próximo registro. Se não corresponder à impressão atual.

    
por user1400953 10.05.2018 / 08:28

3 respostas

1

Awk solução:

awk '{
         items++;
         if ($1 == f1) { print; items = 0 }
         else if (items == 2) { sub(/^[[:space:]]*/, "", prev); print prev; items-- }
     }
     { prev = $0; f1 = $1 }' file

A saída:

puloto_cluster_b_02_sys puloto_cluster_b_generic_cg
puloto_cluster_b_02_temp
puloto_cluster_b_04_sys puloto_cluster_b_generic_cg
puloto_cluster_b_04_temp
puloto_cluster_b_06_sys puloto_cluster_b_generic_cg
puloto_cluster_b_08_sys puloto_cluster_b_generic_cg
puloto_cluster_b_10_sys puloto_cluster_b_generic_cg
    
por 10.05.2018 / 08:45
0

Usando a ferramenta GNU sed :

sed -Ee '
   $!N
   /^[[:blank:]]*([^[:blank:]]{1,})([[:blank:]]|\n)(.*\n){0,1}([[:blank:]]|$)/D
   s/^[[:blank:]]*//;P;D
'  input_file

Explicação:

  • $!N traz a próxima linha para o espaço padrão, desde que não seja a última.
  • /^[[:blank:]]*([^[:blank:]]{1,})([[:blank:]]|\n)(.*\n){0,1}([[:blank:]]|$)/D

    • O primeiro campo da linha atual corresponde ao primeiro campo da próxima linha, depois corta a primeira linha do espaço padrão e volta para o início do script sed com o espaço padrão truncado.
    • OTW, nós imprimimos a primeira linha e, em seguida, cortamos e ramificamos de volta para o topo do script sed e aplicamos os comandos sed no espaço padrão truncado.

Saída:

puloto_cluster_b_02_sys puloto_cluster_b_generic_cg
puloto_cluster_b_02_temp
puloto_cluster_b_04_sys puloto_cluster_b_generic_cg
puloto_cluster_b_04_temp
puloto_cluster_b_06_sys puloto_cluster_b_generic_cg
puloto_cluster_b_08_sys puloto_cluster_b_generic_cg
puloto_cluster_b_10_sys puloto_cluster_b_generic_cg
    
por 10.05.2018 / 09:28
0

Outro awk

awk '{
b=$1
sub("^[[:blank:]]*","")
a=$0
while(getline) {
    if($1!=b)
        print a
    sub("^[[:blank:]]*","")
    a=$0
    b=$1
    }
print a
}' infile
    
por 10.05.2018 / 13:43