J'ai un énorme fichier à traiter et je n'arrive pas à obtenir exactement ce dont j'ai besoin.
Veuillez noter que je ne sais pas à l'avance combien de fois cela se produit dans un fichier (par exemple, cela peut se produire> 1000 fois par fichier ).
Ci-dessous se trouve mon fichier d'entrée (délimité par des tabulations), où $1 est le numéro de ligne. La séquence brisée de nombres se produit à 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
Voici ce que je veux :
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
Voici le code que j'ai réussi à écrire jusqu'à présent (le nom du fichier est test.sh) :
awk '
marker=substr($3,2,6)
{ if (FNR < marker) {printf "\n"}
}' ${1}
Voici le résultat que j'ai obtenu jusqu'à présent :
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 quelqu'un a une meilleure solution pour cela, s'il vous plaît faites le moi savoir.
Réponse acceptée :
Vous êtes marqué comme awk
, nous espérons que Python sera utile.
Code :
# !/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)
Résultats :
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