Je suis nouveau au codage et j'essaie de formater certaines données bioinformatiques. J'essaie de supprimer tous les espaces après 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. P> 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. P> entrée p> sortie p> GT: GL: GOF: GQ: NR: NV Code> 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 code> avec l'option Regex, mais je ne connais pas très bien comment l'utiliser. Je n'ai jamais utilisé Code> SED CODE> 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).
5 Réponses :
Je suppose que le Ceci est assez difficile à faire de manière fiable avec Vous pouvez Essayez quelque chose comme: p> si vous avez votre coeur défini sur xx: xx: xx code> ou
xx: xx: xx: xx code> peut avoir un nombre de pièces, car certains ont 3, et certains avoir 4.
SED code>, car il ne prend pas en charge les regards de recherche, qui semblent être nécessaires pour cet exemple. P>
sed code>, vous pouvez essayer cela, mais cela peut manquer certains cas: < / p>
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 code> 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 code> 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 CODE>, 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 code> sortie
0/1: -1, -1, -1: 146: 28: 14,14: 4,0,0 / 1: -1, -1, -1: 134: 6: 2,2: 1,0 code>
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
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 code>.
Avec des expressions classiques de base, vous pouvez utiliser classes de caractères em> et backreferences em> pour accomplir votre tâche, par exemple Si vous avez toujours besoin de toutes les valises originales ajoutées, par exemple en ajoutant 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 ($ 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
[0-9] [0-9] * CODE> Un ou plusieurs chiffres, LI>
: code> et li>
[0-9] [0-9] * code> Un ou plusieurs chiffres - en tant que groupe de capture 1, li>
\ 1 code> \ 2 code>), enfin li>
g code>) pour remplacer toutes les occurrences de correspondance. LI>
ul>
, 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>
\ |, [0-9] code> à la fin du premier groupe de capture et
\ | [0-9 ] [/] code> à la fin du second, par exemple p>
, 0 0 / code>, vous pouvez raccourcir la commande
sed code> à: p>
[[[: 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>
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 [] code> avec
\ s code>.
Seuls certains SED reconnaîtraient \ s code> comme sténographie pour
[[: espace:]] code>. 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 CODE>, 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 code> sortie
0/1: -1, -1, -1: 146: 28: 14,14: 4,0,0 / 1: -1, -1, -1: 134: 6: 2,2: 1,0 code>
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 CODE> 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 code>. 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 code> (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.
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} code>, etc. puisque cela est testé sur Old Awk afin que celui-ci ne puisse pas le tester. < Pré> xxx pré> p>
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 CODE>, 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 code >> Sortie
0/1: -1, -1, -1: 146: 28: 14,14: 4,0,0 / 1: -1, -1, -1: 134: 6: 2,2: 1,0 code>
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 ' p>
myscript.pl, p>
xxx pré> sortie fort> p>
0/1: -1, -1, -1: 146: 28: 14,14: 4,0,0 / 1: -1, -1, -1: 134: 6: 2,2: 1,0 p>
Cela supprimera tous les espaces, pas juste l'espace en question p> blockQuote>
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é.