Insira uma nova linha após uma seqüência quebrada de números awk / unix / shell scripting

3

Eu tenho um arquivo enorme para processar e não consegui obter exatamente o que preciso. Por favor, note que eu não sei de antemão quantas vezes isso ocorre em um arquivo (por exemplo, poderia acontecer > 1000 vezes por arquivos).

Abaixo está o meu arquivo de entrada (delimitado por TAB), onde $ 1 é o número da linha. A seqüência quebrada de números ocorre em $ 3:

797  47 M797    1     365.0     0.05     0.05 A 0.825
798  47 M798    1     365.0     0.05     0.05 A 0.825
799  47 M799    1     365.0     0.70     0.70 A 0.404
800  47 M800    1     365.0     0.00     0.00 A 0.990
801  47 M802    1     365.0     0.29     0.29 A 0.591
802  47 M803    1     365.0     0.12     0.12 A 0.726

Isso é o que eu quero:

797  47 M797    1     365.0     0.05     0.05 A 0.825
798  47 M798    1     365.0     0.05     0.05 A 0.825
799  47 M799    1     365.0     0.70     0.70 A 0.404
800  47 M800    1     365.0     0.00     0.00 A 0.990
801  
802  47 M802    1     365.0     0.29     0.29 A 0.591
803  47 M803    1     365.0     0.12     0.12 A 0.726

Este é o código que eu consegui escrever até agora (filename is test.sh):

awk '
   marker=substr($3,2,6)
   { if (FNR < marker) {printf "\n"}
    }' ${1}

Esta é a saída que recebi até agora:

797       47 M797   1     365.0     0.05     0.05 A 0.825
798       47 M798   1     365.0     0.05     0.05 A 0.825
799       47 M799   1     365.0     0.70     0.70 A 0.404
800       47 M800   1     365.0     0.00     0.00 A 0.990
801       47 M802   1     365.0     0.29     0.29 A 0.591

802       47 M803    1    365.0     0.12     0.12 A 0.726

803       47 M804    1    365.0     0.08     0.08 A 0.777

Se alguém tiver uma solução melhor para isso, informe-nos.

    
por Newby 27.06.2017 / 18:09

2 respostas

2

Você está marcado como awk , esperamos que o Python seja útil.

Código:

# !/usr/bin/python
import sys

def print_fixed_sequence(filename, line_num=0):
    with open(filename, 'rU') as f:
        for line in (x.strip() for x in f):
            _, f1, f2, data = line.split('\t', 3)
            rec_num = int(f2[1:])
            while line_num != rec_num:
                print(line_num)
                line_num += 1
            print('\t'.join((str(line_num), f1, f2, data)))
            line_num += 1

print_fixed_sequence(sys.argv[1], line_num=795)

Resultados:

795
796
797 47  M797    1   365.0   0.05    0.05    A   0.825
798 47  M798    1   365.0   0.05    0.05    A   0.825
799 47  M799    1   365.0   0.70    0.70    A   0.404
800 47  M800    1   365.0   0.00    0.00    A   0.990
801
802 47  M802    1   365.0   0.29    0.29    A   0.591
803 47  M803    1   365.0   0.12    0.12    A   0.726
    
por 28.06.2017 / 06:05
2

Arquivo de entrada

797     47      M797    1       365.0   0.05    0.05    A       0.825
798     47      M798    1       365.0   0.05    0.05    A       0.825
799     47      M799    1       365.0   0.70    0.70    A       0.404
800     47      M800    1       365.0   0.00    0.00    A       0.990
801     47      M802    1       365.0   0.29    0.29    A       0.591
802     47      M804    1       365.0   0.12    0.12    A       0.726
803     47      M807    1       365.0   0.12    0.12    A       0.726
804     47      M808    1       365.0   0.12    0.12    A       0.726
805     47      M812    1       365.0   0.12    0.12    A       0.726
806     47      M813    1       365.0   0.12    0.12    A       0.726

Código

#!/usr/bin/awk -f
BEGIN{ al=790               # added lines at start
       ap=0                 # appended lines (missing)
     }
{
    lc=$1                # line counter
    $1=lc+ap             # adjust line number
    mr=substr($3,2,6)    # marker
    while( NR+al+ap < lc ){ print "added ++" ++al, ap,"lc=" lc}
    while( NR+al+ap < mr ){ print $1; $1=lc+(++ap); }
    if   ( lc+ap   == mr ){ print }
    if   ( lc+ap    > mr ){ print "errorerror"; exit}
}

Saída

added ++791 0 lc=797
added ++792 0 lc=797
added ++793 0 lc=797
added ++794 0 lc=797
added ++795 0 lc=797
added ++796 0 lc=797
797 47 M797 1 365.0 0.05 0.05 A 0.825
798 47 M798 1 365.0 0.05 0.05 A 0.825
799 47 M799 1 365.0 0.70 0.70 A 0.404
800 47 M800 1 365.0 0.00 0.00 A 0.990
801
802 47 M802 1 365.0 0.29 0.29 A 0.591
803
804 47 M804 1 365.0 0.12 0.12 A 0.726
805
806
807 47 M807 1 365.0 0.12 0.12 A 0.726
808 47 M808 1 365.0 0.12 0.12 A 0.726
809
810
811
812 47 M812 1 365.0 0.12 0.12 A 0.726
813 47 M813 1 365.0 0.12 0.12 A 0.726
    
por 03.07.2017 / 01:09