Modifier les colonnes de chaque ligne d'un fichier

Messages postés
24
Date d'inscription
vendredi 13 avril 2018
Statut
Membre
Dernière intervention
8 juin 2019
- - Dernière réponse : irishupk
Messages postés
24
Date d'inscription
vendredi 13 avril 2018
Statut
Membre
Dernière intervention
8 juin 2019
- 8 juin 2019 à 12:36
Bonjour,

Bonjour,

Mon but est de remplacer chaque colonne de chaque ligne de mon fichier new-vcf.vcf.

voici une partie de mon fichier new-vcf.vcf :

1    783071    rs142849724    C    T    .    PASS    ENSG00000228794;ENST00000624927|ENST00000623808|ENST00000445118|ENST00000448975|ENST00000610067|ENST00000608189|ENST00000609139|ENST00000449005|ENST00000416570|ENST00000623070|ENST00000609009|ENST00000622921    GT    0|0    0|0    1|0    0|0    1|0    0|0    0|0    0|0    0|0    0|1    0|0    0|0    0|0    0|0    0|0    0|0    0|0    0|0    0|0    0|0    0|0    0|0    0|0    0|0    0|0    0|0    0|0    0|0    0|0    0|0    0|0    0|0    0|1    0|0    0|0    0|0    0|1    0|0    0|0    0|0


Voici ce que je voudrai :

1    783071    rs142849724    C    T    .    PASS    ENSG00000228794;ENST00000624927|ENST00000623808|ENST00000445118|ENST00000448975|ENST00000610067|ENST00000608189|ENST00000609139|ENST00000449005|ENST00000416570|ENST00000623070|ENST00000609009|ENST00000622921    GT    C|C    C|C    T|C    C|C    T|C    C|C    C|C    C|C    C|C    C|T    C|C    C|C    C|C    C|C    C|C    C|C    C|C    C|C    C|C    C|C    C|C    C|C    C|C    C|C    C|C    C|C    C|C    C|C    C|C    C|C    C|C    C|C    C|T    C|C    C|C    C|C    C|T    C|C    C|C    C|C  


grâce à de nombreuses recherches, je propose le code suivant :

#!/bin/bash

while read line
do
     while IFS='\t' read -r colonne1 colonne2 colonne3 REF ALT colonne6 colonne7 colonne8 colonne9 colonne10 colonne11 colonne12 colonne13 colonne14 colonne15 colonne16 colonne17 colonne18 colonne19 colonne20 colonne21 colonne22 colonne23 colonne24 colonne25 colonne26 colonne27 colonne28 colonne29 colonne30 colonne31 colonne32 colonne33 colonne34 colonne35 colonne36 colonne37 colonne38 colonne39 colonne40 colonne41 colonne42 colonne43 colonne44 colonne45 colonne46 colonne47 colonne48 colonne49;
    do
        if [[ $colonne9 == "0/0" ]]; then
            awk '{gsub (/"0/0"/, $REF/$REF, $colonne9}' $line
        elif [[ $colonne9 == "1/1" ]]; then
            awk '{gsub (/"1/1"/, $ALT/$ALT, $colonne9}' $line
        elif [[ $colonne9 == "1/0"  ]]; then
            awk '{gsub (/"1/0"/, $ALT/$REF, $colonne9}' $line
        elif [[ $colonne9 == "0/1"  ]]; then
            awk '{gsub (/"0/1"/, $REF/$ALT, $colonne9}' $line
           fi

           if [[ $colonne10 == "0/0" ]]; then
            awk '{gsub (/"0/0"/, $REF/$REF, $colonne10}' $line
        elif [[ $colonne10 == "1/1" ]]; then
            awk '{gsub (/"1/1"/, $ALT/$ALT, $colonne10}' $line
        elif [[ $colonne10 == "1/0"  ]]; then
            awk '{gsub (/"1/0"/, $ALT/$REF, $colonne10}' $line
        elif [[ $colonne10 == "0/1"  ]]; then
            awk '{gsub (/"0/1"/, $REF/$ALT, $colonne10}' $line
           fi
    done < $line
done < new-vcf.vcf


Cependant, je ne sais pas si c'est la meilleure façon de lire par colonne chaque ligne car comme vous pouvez le voir, le fichier est composé de 49 colonnes.
Dois-je faire le bloc if pour chaque colonne que je souhaite modifier ?
Au départ je pensai utiliser une boucle for mais je ne vois pas comment.

Donc au final, je bloque.

Merci

Configuration: Macintosh / Firefox 67.0
Afficher la suite 

2 réponses

Messages postés
37232
Date d'inscription
dimanche 7 novembre 2010
Statut
Contributeur
Dernière intervention
17 octobre 2019
4108
0
Merci
Salut,

Un début de solution ici !

Commenter la réponse de zipe31
Messages postés
17862
Date d'inscription
lundi 15 janvier 2007
Statut
Contributeur
Dernière intervention
18 octobre 2019
4478
0
Merci
hello
awk 'BEGIN{FS=OFS="|"} {for(c=12; c<=NF; c++){gsub("^0|0$", "C", $c); gsub("^1|1$", "T", $c)}; print $0}'  new-vcf.vcf
1 783071 rs142849724 C T . PASS ENSG00000228794;ENST00000624927|ENST00000623808|ENST00000445118|ENST00000448975|ENST00000610067|ENST00000608189|ENST00000609139|ENST00000449005|ENST00000416570|ENST00000623070|ENST00000609009|ENST00000622921 GT C|C C|C T|C C|C T|C C|C C|C C|C C|C C|T C|C C|C C|C C|C C|C C|C C|C C|C C|C C|C C|C C|C C|C C|C C|C C|C C|C C|C C|C C|C C|C C|C C|T C|C C|C C|C C|T C|C C|C C|C
irishupk
Messages postés
24
Date d'inscription
vendredi 13 avril 2018
Statut
Membre
Dernière intervention
8 juin 2019
-
Merci, cependant, cela ne marche que pour la première ligne car il s'agit d'un cas particulier
lEprofSonDkon
Messages postés
213
Date d'inscription
jeudi 13 décembre 2018
Statut
Membre
Dernière intervention
27 septembre 2019
13 > irishupk
Messages postés
24
Date d'inscription
vendredi 13 avril 2018
Statut
Membre
Dernière intervention
8 juin 2019
-
« je connais awk mais pour les commande de "base" mais je souhaite mon perfectionner dans ce langage »
pour cela, il faut pratiquer, ne pas se contenter de ce que font les autres, et proposer les modifications que tu as opérées, même si elles ne fonctionnent pas, car cela montre tes efforts.
irishupk
Messages postés
24
Date d'inscription
vendredi 13 avril 2018
Statut
Membre
Dernière intervention
8 juin 2019
> lEprofSonDkon
Messages postés
213
Date d'inscription
jeudi 13 décembre 2018
Statut
Membre
Dernière intervention
27 septembre 2019
-
Le problème a finalement été résolu. Merci quand même. J'ai prévu de me perfectionner dans le langage awk car grâce à l'aide de nombreuses personnes, je me rends compte que c'est un langage très puissant et très utile et je n'ais pas assez de connaissance dans ce langage. C'est pour cela que j'ai acheté l'ouvrage de Arnold Robbins, Effective AWK Programming, 4e .
dubcek
Messages postés
17862
Date d'inscription
lundi 15 janvier 2007
Statut
Contributeur
Dernière intervention
18 octobre 2019
4478 -
montrer plus de lignes ou dire exactement ce qu'il faut remplacer
Commenter la réponse de dubcek