-2
votes

Comment remplacer les espaces après un certain motif avec des virgules?

Je suis nouveau au codage et j'essaie de formater certaines données bioinformatiques. J'essaie de supprimer tous les espaces après GT: GL: GOF: GQ: NR: NV avec des virgules, mais pas quoi que ce soit en dehors du format XX: xx: xx: xx: xx < / code> (comme l'exemple). Je sais que j'ai besoin d'utiliser sed avec l'option Regex, mais je ne connais pas très bien comment l'utiliser. Je n'ai jamais utilisé SED avant et que je me suis confus, essayez donc toute aide serait appréciée. Désolé si j'ai formaté cela mal (c'est mon premier post).

Edit 2: J'ai eu des données réelles du fichier cette fois-ci pour aider à résoudre le problème. Supprimé le mauvais exemple.

Nouvel exemple: j'ai tiré ces données de mon fichier actuel (il s'agit de deux échantillons), et il est entouré d'autres données. Essentiellement, la ligne a un tas de données suivies de "GT: GL: GOF: GQ: NR: NV", après cela, il existe plus de données dans le format ci-dessous, et enfin, il y a des données plus aléatoires. Malheureusement, je ne peux pas poster une ligne complète des données car il est extrêmement long et ne correspondra pas.

entrée xxx

sortie xxx


2 commentaires

Ressemble beaucoup à un format VCF, comment avez-vous fini avec ce format? Peut-être que si vous expliquez les étapes précédentes, nous n'aurions pas ce problème?


@ ZX8754 J'utilise FAST-GBS pour générer des fichiers VCF, puis les filtrer à l'aide d'un script écrit par le dernier bioinformaticien qui a travaillé ici (et cela génère un fichier texte que j'affiche dans Excel). Cependant, je dois utiliser un délimité pour les colonnes Text-> et je ne veux pas qu'il divise la dernière colonne du fichier généré.


5 Réponses :


2
votes

Je suppose que le xx: xx: xx ou xx: xx: xx: xx peut avoir un nombre de pièces, car certains ont 3, et certains avoir 4.

Ceci est assez difficile à faire de manière fiable avec SED , car il ne prend pas en charge les regards de recherche, qui semblent être nécessaires pour cet exemple.

Vous pouvez Essayez quelque chose comme: xxx

si vous avez votre coeur défini sur sed , vous pouvez essayer cela, mais cela peut manquer certains cas: < / p> xxx


3 commentaires

Merci, je vais essayer cela demain quand je suis de retour à mon ordinateur de travail et que je vois si cela fonctionne. Je ne suis pas super placé sur sed mais quand je cherchais en ligne, j'ai trouvé plus d'exemple de SED utilisé pour des scénarios similaires. Aussi (juste hors de curiosité afin que je puisse apprendre) est-il possible d'utiliser sed -e avec le format que j'ai indiqué?


Cela ne devrait pas être un problème du tout. Vous pouvez également tuyer ou sortir de la commande SED, si vous le souhaitez.


Malheureusement, cela n'a pas fonctionné. Je pense que je n'ai pas fourni de bon exemple des données et cela aurait pu donner la mauvaise idée. J'ai tiré ces données de mon fichier actuel (il s'agit de deux échantillons) et il est entouré d'autres données. Essentiellement, la ligne a un tas de données suivies de GT: GL: GOF: GQ: NR: NV , une fois que vous trouverez plus de données dans le format ci-dessous, et enfin, il existe des données plus aléatoires. Entrée 0/1: -1, -1, -1: 146: 28: 14,14: 4,0 0/1: -1, -1, -1: 134: 6: 2,2: 1 , 0 sortie 0/1: -1, -1, -1: 146: 28: 14,14: 4,0,0 / 1: -1, -1, -1: 134: 6: 2,2: 1,0



0
votes

Vous pouvez également réaliser votre résultat souhaité sans regex, à l'aide de AWK:

awk '{printf "%s", $1FS$2FS$3FS$4FS$5","$6","$7; for (i=8;i<=NF;i++) printf "%s", FS$i; print ""}' input.txt


2 commentaires

Merci pour l'aide, je vais en prendre en compte, mais je ne suis pas sûr que cela fonctionnera comme le nombre de champs qui obligerait le séparateur de virgule pouvant potentiellement varier en fonction des données et même avec les champs après. Mais merci, j'ai appris quelque chose de nouveau :)


@Edmorton Merci d'avoir mentionné les pièges d'une mauvaise utilisation printf .



2
votes

Avec des expressions classiques de base, vous pouvez utiliser classes de caractères em> et backreferences em> pour accomplir votre tâche, par exemple

$ sed 's/\(,[0-9]\)[[:space:]]\([0-9][/]\)/\1,\2/g' file
0/1:-1,-1,-1:146:28:14,14:4,0,0/1:-1,-1,-1:134:6:2,2:1,0
  • Recherchez et capturez tout [0-9] [0-9] * CODE> Un ou plusieurs chiffres, LI>
  • séparé par un : code> et li>
  • suivi de [0-9] [0-9] * code> Un ou plusieurs chiffres - en tant que groupe de capture 1, li>
  • Faites correspondre un espace suivant Capture Group 1 suivi d'un groupe de capture 2 (qui est identique au groupe de capture 1), LI>
  • Puis remplacez l'espace séparant les groupes de capture par une virgule réinsérant le texte du groupe de capture à l'aide de la correction 1 et 2 (par exemple, \ 1 code> \ 2 code>), enfin li>
  • Faites le remplacement global em> (E.G. g code>) pour remplacer toutes les occurrences de correspondance. LI> ul>

    Modifier en fonction de la nouvelle entrée postée forte> p>

    Si vous avez toujours besoin de toutes les valises originales ajoutées, et strong> vous voulez maintenant ajouter une virgule entre , 0 0 / code> (où une virgule est précède un seul chiffre suivi de l'espace à remplacer par une virgule, suivie d'un seul chiffre et d'une barre oblique), Ensuite, tout ce que vous avez à faire est de rendre vos groupes de capture conditionnels (sur la capture des données d'origine comme ci-dessus, en capturant ce nouveau segment. Vous le faites en incluant un ou (par exemple, \ | code> dans la regex de base Termes) entre les conditions. p>

    par exemple en ajoutant \ |, [0-9] code> à la fin du premier groupe de capture et \ | [0-9 ] [/] code> à la fin du second, par exemple p> xxx pré>

    si vous avez d'autres mises en garde dans votre fichier, je vous suggère de poster plusieurs lignes complètes d'entrée, et s'ils sont trop longs, créez un fichier zip, gzip, bzip ou xz et postez-le sur un site comme Pastebin et ajoutez le lien à votre question. P>

    Si tout ce que vous reasez Lly Care abortique maintenant est l'espace dans , 0 0 / code>, vous pouvez raccourcir la commande sed code> à: p> xxx pré>

    ( NOTE: STRUT> J'ai inclus [[[: espace:]]] code> pour gérer n'importe quel espacement (espace, tabulation, ...) au lieu de simplement le [] code> (espace) dans le nouvel exemple) Laissez-moi savoir si cela corrige le problème. P> p>


9 commentaires

Wow, c'est une explication géniale. Merci, pour la réponse, je vais essayer cela aussi demain demain.


Bien sûr, heureux d'aider. Si vous avez des expressions régulières étendues, ils peuvent raccourcir un peu la commande, mais certains systèmes ne les soutiennent pas. Vous pouvez toujours utiliser des expressions de base régulières - même si cela prend quelques coups de frappe supplémentaires. Bon de savoir les deux. Notez également que si vous souhaitez correspondre à n'importe quel espace blanche entre les groupes de capture, vous pouvez remplacer [] avec \ s .


Seuls certains SED reconnaîtraient \ s comme sténographie pour [[: espace:]] . GNU SED serait, idk sur les autres.


Bon point. (J'étais coincé à prendre l'enquête - prenez une tasse de café et des pantoufles confortables en premier ...)


Malheureusement, cela n'a pas fonctionné. Je pense que je n'ai pas fourni de bon exemple des données et cela aurait pu donner la mauvaise idée. J'ai tiré ces données de mon fichier actuel (il s'agit de deux échantillons) et il est entouré d'autres données. Essentiellement, la ligne a un tas de données suivies de GT: GL: GOF: GQ: NR: NV , une fois que vous trouverez plus de données dans le format ci-dessous, et enfin, il existe des données plus aléatoires. Entrée 0/1: -1, -1, -1: 146: 28: 14,14: 4,0 0/1: -1, -1, -1: 134: 6: 2,2: 1 , 0 sortie 0/1: -1, -1, -1: 146: 28: 14,14: 4,0,0 / 1: -1, -1, -1: 134: 6: 2,2: 1,0


Veuillez poster une ligne complète à partir de vos données d'exemple. Il est impossible de fournir une solution confirmée lorsqu'elle présente uniquement des données partielles. Je soupçonne que vous avez des nombres séparés de côlons supplémentaires dans la ligne qui poseront des problèmes.


@ DAVIDC.RANKIN Je ne peux pas publier une ligne entière car la ligne est extrêmement longue (environ 400 colonnes / échantillons) avec beaucoup de variantes. Il n'y a pas de points supplémentaires dans la ligne, à part de la section après GT: GL: GOF: GQ: NR: NV Qui a les données qui nécessitent des virgules entre eux (plutôt que des espaces). J'ai ajouté un exemple au post montrant ce que deux échantillons complets de données semblent être séparés par une virgule plutôt qu'un espace (directement du fichier).


@ Davidc.rankin merci beaucoup, travaillé parfaitement !!


Heureux d'avoir aidé. Ça vaut la peine de faire des amis avec SED . C'est cryptique comme l'enfer au début, mais prenez des expressions régulières de la même manière que vous mangez une baleine (une bouchée à la fois) et, en une très courte période, vous pouvez en parler très couramment. Faites aussi des amis avec awk (même analogie cryptique), mais avec les deux dans votre boîte à outils, il existe très peu de problèmes de traitement de texte que vous ne pouvez pas résoudre.



0
votes

Pourriez-vous s'il vous plaît essayer de suivre. Cela s'occupera de l'impression de ces valeurs également qui n'arrivent pas au combat de la regex. En outre, nous aurions fait mentionné Regex en match un peu plus court en le faisant comme [0-9] + \. {4} , etc. puisque cela est testé sur Old Awk afin que celui-ci ne puisse pas le tester. < Pré> xxx


1 commentaires

Malheureusement, cela n'a pas fonctionné. Je pense que je n'ai pas fourni de bon exemple des données et cela aurait pu donner la mauvaise idée. J'ai tiré ces données de mon fichier actuel (il s'agit de deux échantillons) et il est entouré d'autres données. Essentiellement, la ligne a un tas de données suivies de GT: GL: GOF: GQ: NR: NV , une fois que vous trouverez plus de données dans le format ci-dessous, et enfin, il existe des données plus aléatoires. > Entrée 0/1: -1, -1, -1: 146: 28: 14,14: 4,0 0/1: -1, -1, -1: 134: 6: 2,2: 1,0 > Sortie 0/1: -1, -1, -1: 146: 28: 14,14: 4,0,0 / 1: -1, -1, -1: 134: 6: 2,2: 1,0



0
votes

perl myscript.pl '0/1: -1, -1, -1: 146: 28: 14,14: 4,0 0/1: -1, -1, -1: 134: 6: 2 , 2: 1,0 '

myscript.pl, xxx

sortie

0/1: -1, -1, -1: 146: 28: 14,14: 4,0,0 / 1: -1, -1, -1: 134: 6: 2,2: 1,0

Cela supprimera tous les espaces, pas juste l'espace en question


0 commentaires