J'ai un fichier qui ressemble à ceci:
chr19 61336212 + 0 0 CG CGT
chr19 61336213 - 0 0 CG CGG
chr19 61336218 + 0 0 CG CGG
chr19 61336219 - 0 0 CG CGC
chr19 61336268 + 0 0 CG CGG
chr19 61336269 - 0 0 CG CGA
chr19 61336402 + 0 0 CG CGG
chr19 61336403 - 0 0 CG CGT
Je veux diviser ce fichier pour chaque intervalle de 10000 du 2e champ (PAS les lignes, mais l'intervalle de nombre). Donc, pour ce fichier, je voudrais séparer de la première ligne (la ligne avec 61336212) à la ligne qui a ou jusqu'à 61346211 (61336212 + 9999), puis de 61346212 à 61356211, et ainsi de suite et ainsi de suite. Comme vous pouvez le voir, les chiffres dans le 2ème champ / colonne ne sont pas «remplis».
Y a-t-il un moyen de faire cela?
text-processing
awk
split
agathusie
la source
la source
Réponses:
Écrirais à
file.0000
,file.0001
... (le nombre étantint(($2-n)/10000)
oùn
est$2
la première ligne).Notez que nous fermons les fichiers une fois que nous avons cessé d'écrire dessus, sinon vous atteindriez la limite du nombre de fichiers ouverts simultanément après quelques centaines de fichiers (GNU
awk
peut contourner cette limite, mais les performances se dégradent rapidement).Nous supposons que ces chiffres augmentent toujours.
la source
file = ...
, mais comment fonctionne l'itération? Il n'y a ni partie qui ditn = n + 10000
nilower_boundary <= $2 < upper_boundary
partie. En général le toutif (file != last_file) { close(last_file) ; last_file = file }
est hors de ma ligueif (file != last_file)
: si le fichier actuel n'est pas le même que le fichier précédent, fermez le fichier précédent (alors n'ouvrez qu'un seul fichier à la fois (nous n'avons pas besoin de les garder) tous ouverts comme le font d'autres solutions))Version hack one-liner. Peut-être plus approprié pour Code Golf que ce forum. Cela génère split1, split2, split3 et ainsi de suite, en tant que noms de fichiers.
Pour avoir des fichiers de sortie nommés split001, split002, split003, cela implique ceci
sprintf
:Pour éviter le problème de ralentissement gawk identifié par @ Stéphane Chazelas, utilisez perl:
la source
sprintf
magie supplémentaire est désormais ajoutée.Test avec intervalle défini sur 100:
Remarque: produira des fichiers vides pour des intervalles vides; pour supprimer les fichiers vides, ajoutez:
Exécute le fichier pour chaque étape de la
for
boucle, donc pas le plus efficace.la source
Si vous voulez dire juste un calcul et non un comptage de lignes:
la source