Tengo que procesar un archivo enorme y no pude obtener exactamente lo que necesito.
Tenga en cuenta que no sé de antemano cuántas veces ocurre esto en un archivo (por ejemplo, podría ocurrir> 1000 veces por archivo ).
A continuación se muestra mi archivo de entrada (delimitado por TAB), donde $1 es el número de línea. La secuencia rota de números ocurre en $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
Esto es lo que quiero:
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 es el código que logré escribir hasta ahora (el nombre del archivo es test.sh):
awk '
marker=substr($3,2,6)
{ if (FNR < marker) {printf "\n"}
}' ${1}
Este es el resultado que obtuve hasta ahora:
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
Si alguien tiene una solución mejor para esto, hágamelo saber.
Respuesta aceptada:
Estás etiquetado como awk
, con suerte, Python será ú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