IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Shell et commandes GNU Discussion :

Modification de données sous conditions


Sujet :

Shell et commandes GNU

  1. #1
    Membre à l'essai
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Janvier 2020
    Messages
    16
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : Conseil

    Informations forums :
    Inscription : Janvier 2020
    Messages : 16
    Points : 15
    Points
    15
    Par défaut Modification de données sous conditions
    Bonjour à tous,
    Depuis quelques temps je suis à la recherche d'une solution pour modifier une partie de mes données brutes en vain.
    Voici mes données brutes: en première colonne le nom des chromosomes, en 2eme la position physique, en 3eme l'identifiant unique de ma ligne, en 6eme une codification à utiliser, en 7eme ma colonne à modifier.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    CHROM	POS	ID	REF	ALT	IUPAC	CONTEXT
    1	144	1_144	C	A	M	CAAATAATGATCAAATAAATTTAAAAAGCAATTTTACTCAATATTGTTTTAGCGTGTTAAGAATTATTTTTTAACTTCTTTTTGAATATTTGAAGGCATA[C/A]CATGTGAAACCTCAATTTTTAGCCATTCCNAACATACAAGTCAAATATTAGCCCATTTTAAAACTTCAATTTTCAGCTCGAAATTTGTCGATTTTCAAAG
    1	174	1_174	C	A,T	H	ATTTTACTCAATATTGTTTTAGCGTGTTAAGAATTATTTTTTAACTTCTTTTTGAATATTTGAAGGCATANCATGTGAAACCTCAATTTTTAGCCATTCC[C/A]AACATACAAGTCAAATATTAGCCCATTTTAAAACTTCAATTTTCAGCTCGAAATTTGTCGATTTTCAAAGGGGTTAACCTATGGAAAGGAGTCATTTTGA
    1	303	1_303	G	C	S	TAAAACTTCAATTTTCAGCTCGAAATTTGTCGATTTTCAAAGGGGTTAACCTATGGAAAGGAGTCATTTTGACATGAAAATTTCAAAATTTGGAAACCGG[G/C]TAATATTTGACATTCATGTTTTGAATGGCTAAAAGTGAAGTTTCATTACGGCAACCCCTGCAAATAATGATCAAATAAATTTAAAAATCAATTCTACTCA
    1	442	1_442	T	A	W	AGTTTCATTACGGCAACCCCTGCAAATAATGATCAAATAAATTTAAAAATCAATTCTACTCAATATTGTTTTAGCGTGTTAAGAATTATTTTTTAACTTC[T/A]TTTTGAATATTTGAAGGCATACCATGGTGAACCTCAATTTTTAGCCATTCCCCATGGTGAAACCTCAATTTTTAGTCATTCCCAACATACAAGTCAAATA
    Objectif: dans cet exemple, la ligne contenant le 1_144 possède à droite du [C/A] dans la colonne N°7 un "N" à 30 bases plus loin correspondant à la base de la ligne suivante nommée 1_174 car les séquence distance de moins de 100 unités sont chevauchantes. Et inversement, dans la ligne contenant le 1_174, on retrouve à gauche du [C/A] un "N" à -30 bases de la ligne précédente nommée 1_144. Il faudrait pour la ligne 1_144 remplacer le "N" par "H" pris dans la ligne 1_174 et pour la ligne 1_174 remplacer le "N" par "M" pris dans la ligne 1_144. Cela est vrai uniquement si la distance entre les lignes est inférieur à 100 unités. Au dela nous avons pas de recouvrement de séquence et donc pas de modification à opérer.
    Résultats souhaité:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    CHROM	POS	ID	REF	ALT	IUPAC	CONTEXT
    1	144	1_144	C	A	M	CAAATAATGATCAAATAAATTTAAAAAGCAATTTTACTCAATATTGTTTTAGCGTGTTAAGAATTATTTTTTAACTTCTTTTTGAATATTTGAAGGCATA[C/A]CATGTGAAACCTCAATTTTTAGCCATTCCHAACATACAAGTCAAATATTAGCCCATTTTAAAACTTCAATTTTCAGCTCGAAATTTGTCGATTTTCAAAG
    1	174	1_174	C	A,T	H	ATTTTACTCAATATTGTTTTAGCGTGTTAAGAATTATTTTTTAACTTCTTTTTGAATATTTGAAGGCATAMCATGTGAAACCTCAATTTTTAGCCATTCC[C/A]AACATACAAGTCAAATATTAGCCCATTTTAAAACTTCAATTTTCAGCTCGAAATTTGTCGATTTTCAAAGGGGTTAACCTATGGAAAGGAGTCATTTTGA
    1	303	1_303	G	C	S	TAAAACTTCAATTTTCAGCTCGAAATTTGTCGATTTTCAAAGGGGTTAACCTATGGAAAGGAGTCATTTTGACATGAAAATTTCAAAATTTGGAAACCGG[G/C]TAATATTTGACATTCATGTTTTGAATGGCTAAAAGTGAAGTTTCATTACGGCAACCCCTGCAAATAATGATCAAATAAATTTAAAAATCAATTCTACTCA
    1	442	1_442	T	A	W	AGTTTCATTACGGCAACCCCTGCAAATAATGATCAAATAAATTTAAAAATCAATTCTACTCAATATTGTTTTAGCGTGTTAAGAATTATTTTTTAACTTC[T/A]TTTTGAATATTTGAAGGCATACCATGGTGAACCTCAATTTTTAGCCATTCCCCATGGTGAAACCTCAATTTTTAGTCATTCCCAACATACAAGTCAAATA
    Attention: il se peut qu'il y ait plusieurs "N" dans les séquences à gauche et a droite de [./.], mais il faut prendre spécifiquement le bon, a savoir si la distance 174-144 =30, alors on ne doit modifier que le N à +30, et inversement à -30 pour l'autre ligne.
    Merci de votre aide !
    Fichiers attachés Fichiers attachés

  2. #2
    Expert éminent sénior Avatar de Flodelarab
    Homme Profil pro
    Inscrit en
    Septembre 2005
    Messages
    5 243
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente (Poitou Charente)

    Informations forums :
    Inscription : Septembre 2005
    Messages : 5 243
    Points : 13 459
    Points
    13 459
    Par défaut
    Bonjour

    Ton algorithme étant si clair, la seule question qui reste est : pourquoi ne le fais-tu pas ?
    Avec awk, le deuxième champ est désigné par $2 et le septième par $7; tu peux alors chercher les indices de tes expressions ([C/A], N, etc) avec la commande find( ).Et remplacer par le 6ème champ, $6, si un critère est vérifié.

    Bonne chance !
    Cette réponse vous apporte quelque chose ? Cliquez sur en bas à droite du message.

  3. #3
    Modérateur
    Avatar de N_BaH
    Profil pro
    Inscrit en
    Février 2008
    Messages
    7 553
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 7 553
    Points : 19 392
    Points
    19 392
    Par défaut
    find() ?
    .
    N'oubliez pas de consulter les cours shell, la FAQ, et les pages man.

  4. #4
    Membre à l'essai
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Janvier 2020
    Messages
    16
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : Conseil

    Informations forums :
    Inscription : Janvier 2020
    Messages : 16
    Points : 15
    Points
    15
    Par défaut
    Bonjour,
    Mon soucis principal est d'avoir un compteur de caractère à partir de ma requète [./.] pour aller piocher dans la bonne ligne et la colonne d'interet IUPAC …
    Merci :-)

  5. #5
    Expert éminent sénior Avatar de Flodelarab
    Homme Profil pro
    Inscrit en
    Septembre 2005
    Messages
    5 243
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente (Poitou Charente)

    Informations forums :
    Inscription : Septembre 2005
    Messages : 5 243
    Points : 13 459
    Points
    13 459
    Par défaut
    Pardon. L'intitulé exact est index().

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    index(in, find)
     
        Search the string in for the first occurrence of the string find, and return the position in characters where that occurrence begins in the string in. Consider the following example:
     
        $ awk 'BEGIN { print index("peanut", "an") }'
        -| 3
     
        If find is not found, index() returns zero.
     
        With BWK awk and gawk, it is a fatal error to use a regexp constant for find. Other implementations allow it, simply treating the regexp constant as an expression meaning ‘$0 ~ /regexp/’. (d.c.)
    "return the position in characters" veut dire qu'il compte les caractères.

    Source :
    https://www.gnu.org/software/gawk/ma...Functions.html
    Cette réponse vous apporte quelque chose ? Cliquez sur en bas à droite du message.

  6. #6
    Membre éprouvé Avatar de balkany
    Homme Profil pro
    Touriste
    Inscrit en
    Juillet 2017
    Messages
    346
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Touriste

    Informations forums :
    Inscription : Juillet 2017
    Messages : 346
    Points : 977
    Points
    977
    Par défaut
    C'est un cas particulier que le nombre de bases à gauche et à droite de [./.] soit égal à 100 ?
    Parce que si c'est toujours le cas, il n'y a pas besoin de compter…
    Mais peut-être que je ne comprends pas tout dans cette histoire

  7. #7
    Membre à l'essai
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Janvier 2020
    Messages
    16
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : Conseil

    Informations forums :
    Inscription : Janvier 2020
    Messages : 16
    Points : 15
    Points
    15
    Par défaut
    oui c'est pas simple a expliquer… pardon
    Pour chaque [./.] j'ai toujours extrait 100 lettres à gauche et 100 lettres à droite. Si 2 identifiants de ligne ont des numéros s'espaçant de moins de 100, cela veut dire que dans la séquence de lettres de ma ligne considérée je vais retrouver un N. Ce N, je voudrais le substituer au caractère présent dans la colonne IUPAC de la ligne suivante s'il se trouve a droite du [./.], soit le substituer au caractère présent dans la colonne IUPAC de la ligne précédente s'il se trouve a droite du [./.]

    Je voulais compter car parfois je peux avoir 3 ou 4 identifiants de lignes en 100 unités, donc 3 ou 4 N à substituer sur la ligne considérée.

  8. #8
    Membre éprouvé Avatar de balkany
    Homme Profil pro
    Touriste
    Inscrit en
    Juillet 2017
    Messages
    346
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Touriste

    Informations forums :
    Inscription : Juillet 2017
    Messages : 346
    Points : 977
    Points
    977
    Par défaut
    Ah d'accord, j'avais complètement zappé les colonnes 2 et 3, désolé.
    Donc du coup, puisqu'on sait à priori où doit se trouver le N, j'utiliserais plutôt la fonction substr() pour tester sa présence à l'endroit voulu, et sortir en erreur sinon (ou faire autre chose…).
    Mais sinon, c'est ce qu'a dit Flodelarab en #2, donc : à toi de proposer un premier essai de codage !

  9. #9
    Membre à l'essai
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Janvier 2020
    Messages
    16
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : Conseil

    Informations forums :
    Inscription : Janvier 2020
    Messages : 16
    Points : 15
    Points
    15
    Par défaut
    Merci pour les indications ! je vais tester les fonctions

  10. #10
    Membre à l'essai
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Janvier 2020
    Messages
    16
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : Conseil

    Informations forums :
    Inscription : Janvier 2020
    Messages : 16
    Points : 15
    Points
    15
    Par défaut
    Citation Envoyé par adrientdl13 Voir le message
    Merci pour les indications ! je vais tester les fonctions
    J'ai trouvé une solution en passant par l'outil qui s'appelle "bcftools concensus" qui propose une option adéquate.

    Par ailleurs, dans mon exemple premier, il y a quelques erreurs. Si par exemple dans ma 4eme colonne nommée REF j'ai "C" et dans ma 5eme colonne j'ai "A,T"; je devrais donc retrouver dans ma 7eme colonne [C/A,T].
    Or pour le moment je n'ai que [C/A]. Comment puis-je modifier ce qu'il se trouve après le "/" dans ma 7eme colonne en fonction de l'information contenue dans ma 5eme colonne SVP ?

    Un grand merci une nouvelle fois de vos aides

  11. #11
    Membre éprouvé Avatar de balkany
    Homme Profil pro
    Touriste
    Inscrit en
    Juillet 2017
    Messages
    346
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Touriste

    Informations forums :
    Inscription : Juillet 2017
    Messages : 346
    Points : 977
    Points
    977
    Par défaut
    Tu peux faire
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    awk 'BEGIN{OFS=FS="\t"} {sub("\\[.*\\]","["$4"/"$5"]",$7); print}' fichier

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. selection et écriture de données sous condition avec boucle
    Par braquin dans le forum Macros et VBA Excel
    Réponses: 0
    Dernier message: 25/08/2011, 09h16
  2. récupérer des données sous conditions
    Par Lost_in_VBA dans le forum Macros et VBA Excel
    Réponses: 8
    Dernier message: 19/07/2011, 14h11
  3. Copier des données sous condition
    Par delphine1987 dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 25/04/2011, 22h17
  4. [XL-2007] D'un classeur, récupérer des données sous condition
    Par SenseniX dans le forum Macros et VBA Excel
    Réponses: 18
    Dernier message: 25/06/2010, 10h58
  5. [XL-2007] Récupérer des données sous conditions
    Par christophe31 dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 18/05/2010, 15h20

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo