Como adicionar uma nova linha para uma entrada ausente entre dois campos

2

Eu tenho este arquivo. Como você pode ver na coluna1, entradas TEST01N03, TEST01N06, e TEST01N18 estão faltando (total de 18 entradas). Existe uma maneira de verificar os campos dessa coluna e preencher os dados ausentes? entradas?

TEST01N01 40   2002    2697    2523  
TEST01N02 40   4       4       5    
TEST01N04 40   4       4       5  
TEST01N05 40   4       4       5  
TEST01N07 40   4       4       5  
TEST01N08 40   1       4       5  
TEST01N09 40   4       4       5  
TEST01N10 40   4       4       5  
TEST01N11 40   2002    2621    2617  
TEST01N13 40   1       4       5  
TEST01N14 40   1       4       5    
TEST01N15 40   1       4       5  
TEST01N16 40   1       4       5  
TEST01N17 40   2002    2576    2515

A saída deve ficar assim:

TEST01N01 40   2002    2697    2523  
TEST01N02 40   4       4       5    
TEST01N03 empty  
TEST01N04 40   4       4       5  
TEST01N05 40   4       4       5  
TEST01N06 empty  
TEST01N07 40   4       4       5  
TEST01N08 40   1       4       5  
TEST01N09 40   4       4       5  
TEST01N10 40   4       4       5  
TEST01N11 40   2002    2621    2617  
TEST01N12 empty  
TEST01N13 40   1       4       5  
TEST01N14 40   1       4       5    
TEST01N15 40   1       4       5  
TEST01N16 40   1       4       5  
TEST01N17 40   2002    2576    2515  
TEST01N18 empty  

Realmente apreciado por qualquer sugestão de um script para conseguir isso.

    
por nvt007 11.07.2014 / 19:32

2 respostas

1

Aqui está uma solução perl :

$ perl -anle 'BEGIN {$pattern = "TEST01N"}
    $curr = $F[0] =~ s/$pattern//r;
    if ($prev and ++$prev != $curr) {
        printf "%s%02d empty\n", $pattern, $prev;
        redo;
    } 
    $prev = $curr;
    print;
' file
TEST01N01 40 2002 2697 2523
TEST01N02 40 4 4 5
TEST01N03 empty
TEST01N04 40 4 4 5
TEST01N05 40 4 4 5
TEST01N06 empty
TEST01N07 40 4 4 5
TEST01N08 40 1 4 5
TEST01N09 40 4 4 5
TEST01N10 40 4 4 5
TEST01N11 40 2002 2621 2617
TEST01N12 empty
TEST01N13 40 1 4 5
TEST01N14 40 1 4 5
TEST01N15 40 1 4 5
TEST01N16 40 1 4 5
TEST01N17 40 2002 2576 2515

Explicação

  • Obtemos o índice da coluna atual, salve na variável $curr
  • Se $prev for definido e seu valor mais 1 não for igual a $curr , o que significa que faltou a entrada, imprimi-lo e refazer desde o início até $prev equal $curr .
  • Atribua $curr valor a $prev .
  • Imprima a linha.

Atualizar

Para o comentário de @Baby, você pode tentar:

$ perl -anle 'BEGIN {$pattern = "TEST01N"}
    $curr = $F[0] =~ s/$pattern//r;     
    if ($. == 1 and (0+$curr) != ++$i) {
        printf "%s%02d empty\n", $pattern, $i;
        redo;
    }
    if ($prev and ++$prev != $curr) {
        printf "%s%02d empty\n", $pattern, $prev;
        redo;
    } 
    $prev = $curr;
    print;
' file
    
por 11.07.2014 / 20:50
0

No awk: analise cada linha de entrada para localizar o current index após o prefixo TEST01N . Se o número da linha de saída atual ( n ) for menor que o índice, imprima linhas ausentes antes de copiar a linha de entrada. Por fim, adicione mais linhas para alcançar a contagem desejada.

{
    i = match($1,/[0-9]+$/);
    prefix = substr($1,1,i-1);
    current = substr($1,i) + 0;
    while (++n < current) printf "%s%02d empty\n", prefix, n;
    print;
 }
 END {
    while (++n <= 18) printf "%s%02d empty\n", prefix, n;
 }
    
por 13.07.2014 / 02:25