Modifier les colonnes de chaque ligne d'un fichier

Fermé
irishupk Messages postés 25 Date d'inscription vendredi 13 avril 2018 Statut Membre Dernière intervention 29 juin 2020 - 7 juin 2019 à 00:12
irishupk Messages postés 25 Date d'inscription vendredi 13 avril 2018 Statut Membre Dernière intervention 29 juin 2020 - 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
A voir également:

2 réponses

zipe31 Messages postés 36402 Date d'inscription dimanche 7 novembre 2010 Statut Contributeur Dernière intervention 27 janvier 2021 6 407
7 juin 2019 à 08:44
Salut,

Un début de solution ici !

0
dubcek Messages postés 18718 Date d'inscription lundi 15 janvier 2007 Statut Contributeur Dernière intervention 22 mars 2024 5 615
Modifié le 7 juin 2019 à 15:10
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
0
irishupk Messages postés 25 Date d'inscription vendredi 13 avril 2018 Statut Membre Dernière intervention 29 juin 2020 1
7 juin 2019 à 22:05
Merci, cependant, cela ne marche que pour la première ligne car il s'agit d'un cas particulier
0
lEprofSonDkon Messages postés 211 Date d'inscription jeudi 13 décembre 2018 Statut Membre Dernière intervention 8 octobre 2022 13 > irishupk Messages postés 25 Date d'inscription vendredi 13 avril 2018 Statut Membre Dernière intervention 29 juin 2020
8 juin 2019 à 12:21
« 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.
0
irishupk Messages postés 25 Date d'inscription vendredi 13 avril 2018 Statut Membre Dernière intervention 29 juin 2020 1 > lEprofSonDkon Messages postés 211 Date d'inscription jeudi 13 décembre 2018 Statut Membre Dernière intervention 8 octobre 2022
8 juin 2019 à 12:36
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 .
0
dubcek Messages postés 18718 Date d'inscription lundi 15 janvier 2007 Statut Contributeur Dernière intervention 22 mars 2024 5 615
Modifié le 8 juin 2019 à 11:15
montrer plus de lignes ou dire exactement ce qu'il faut remplacer
0