Partage
  • Partager sur Facebook
  • Partager sur Twitter

suppression de ligne dans un fichieren fontion

d'un pattern présent dans une colonne précise

    2 mai 2019 à 13:34:41

    Bonjour,

    Après de nombreuses recherches et essais, je me retourne vers vous.

    Je souhaiterai supprimer les ligne de mon fichier qui contiennent le caractère . dans la colonne 3.

    Voici à quoi ressemble mon fichier :

    1    899634    rs114053887    C    T    .    .    BIOMART_COORDS=1:899634:899634 0/1:T=6,C=21:0:27:heterozygous    0/0:C=46:0:46:homozygous   
    1    900285    rs4970435    C    T    .    .    BIOMART_COORDS=1:900285:9002851/1:T=22:0:22:homozygous    1/1:T=3:3:3:homozygous  
    1    900382    .    C    .    .    .    BIOMART_COORDS=1:900382:900382;GENE=ENSG00000187961 0/0:C=76:0:76:homozygous    0/0:C=81:0:81:homozygous    0/0:C=63:0:63:homozygous    0/0:C=56:0:56:homozygous    0/0:C=91:0:91:homozygous
    1 900286 rs4970434 A G . . BIOMART_COORDS=1:900286:900286 1/1:G=49:0:49:homozygous 0/1:A=7,G=22:0:29:heterozygous 1/1:G=22:0:22:homozygous 1/1:G=3:3:3:homozygous 1/1:G=24:0:24:homozygous

    Ainsi, si la ligne contient dans la troisième colonne un rs, on ne touche à rien mais si la ligne contient un . dans la troisième colonne, alors on la supprime pour au final avoir un fichier de la forme :

    1    899634    rs114053887    C    T    .    .    BIOMART_COORDS=1:899634:899634 0/1:T=6,C=21:0:27:heterozygous    0/0:C=46:0:46:homozygous   
    1    900285    rs4970435    C    T    .    .    BIOMART_COORDS=1:900285:9002851/1:T=22:0:22:homozygous    1/1:T=3:3:3:homozygous  
    1    900286    rs4970434    A    G    .    .    BIOMART_COORDS=1:900286:900286 1/1:G=49:0:49:homozygous    0/1:A=7,G=22:0:29:heterozygous    1/1:G=22:0:22:homozygous    1/1:G=3:3:3:homozygous    1/1:G=24:0:24:homozygous  
    


    Donc au final je souhaite supprimer toutes les lignes avec . dans la troisième colonne.

    voilà ce que j'ai entre autre essayé ;:

    while read line
    do
    	echo -e "$line"
    	a=$(awk -F \t '$3 ~ /\./' GQPDOMB_verifie.vcf | awk '{print $3}')		
    	
    	if test -n "$a"				
    	then 
    		sed '$a d' GQPDOMB_verifie.vcf
    		echo "ok "
    	fi
    done < GQPDOMB_verifie.vcf

    Merci d'avance



    -
    Edité par Amandine Lecerf Defer 2 mai 2019 à 13:43:01

    • Partager sur Facebook
    • Partager sur Twitter

    Amandine,  Licence de Biologie, Master de Bioinformatique, en formation de Data Scientist

      2 mai 2019 à 15:05:19

      regarde sed ça devrait carremernt te plaire :)

      • Partager sur Facebook
      • Partager sur Twitter

      la connaissance est une chose qui ne nous appauvrit pas quand on la partage.

      Mon GitHub

        2 mai 2019 à 15:38:11

        Bonjour,

        Je propose ça :

        #!/bin/bash
        
        #sed -i -e 's/\r$//' essai.sh
        
        while read line
        do
            echo -e "$line"
        	a=$(grep "\." $3 $line | awk '{print $3}')
        	
            if test -n "$a"            
            then
                sed '$line d' GQPDOMB_verifie.vcf
                #echo "ok "
            fi
        done < GQPDOMB_verifie.vcf

        Mais ça ne marche pas

        -
        Edité par Amandine Lecerf Defer 2 mai 2019 à 15:49:00

        • Partager sur Facebook
        • Partager sur Twitter

        Amandine,  Licence de Biologie, Master de Bioinformatique, en formation de Data Scientist

          2 mai 2019 à 16:20:50

          essais cette ligne là : 
          sed -i -r '/^[0-9]+\s+[0-9]+\s+\./d' file

           oucelle-ci :

          sed -i -r '/^([0-9]+\s+){2}\./d' file

          -
          Edité par ox223252 2 mai 2019 à 16:28:22

          • Partager sur Facebook
          • Partager sur Twitter

          la connaissance est une chose qui ne nous appauvrit pas quand on la partage.

          Mon GitHub

            2 mai 2019 à 16:22:26

            Bonjour
            Vite fais:
            #!/bin/bash
            NEW_FILE=/tmp/new_file.txt
            
            >$NEW_FILE
            
            while read line
            do
                THIRDF=$(echo $line |awk '{print $3}')
            
                if [[ $THIRDF != "." ]]
                then
                    echo "$line" >> $NEW_FILE
            
                fi
            done < GQPDOMB_verifie.vcf
            Olivier

            -
            Edité par Olivier1236 2 mai 2019 à 16:25:14

            • Partager sur Facebook
            • Partager sur Twitter
              2 mai 2019 à 16:41:51

              Malheureusement, aucune des deux commandes ne marche

              ox223252 a écrit:

              essais cette ligne là : 

              sed -i -r '/^[0-9]+\s+[0-9]+\s+\./d' file

               oucelle-ci :

              sed -i -r '/^([0-9]+\s+){2}\./d' file

              -
              Edité par ox223252 il y a 28 minutes

              Malheureusement cela ne marche pas non plus car il ne prends en compte que l'en tête de mon fichier qui ne me sert pas

              Olivier1236 a écrit:

              Bonjour
              Vite fais:
              #!/bin/bash
              NEW_FILE=/tmp/new_file.txt
              
              >$NEW_FILE
              
              while read line
              do
                  THIRDF=$(echo $line |awk '{print $3}')
              
                  if [[ $THIRDF != "." ]]
                  then
                      echo "$line" >> $NEW_FILE
              
                  fi
              done < GQPDOMB_verifie.vcf
              Olivier

              -
              Edité par Olivier1236 il y a 31 minutes


              EDIT :

              avec les ligne suivantes, j'ai réussi à récupérer les ligne qui correspondent à ma condition mais je n'arrive pas à les supprimer par la suite :

              cat GQPDOMB_verifie.vcf | cut -d$'\t' -f3 | grep -n "\." >nb_ligne.txt



              Supprimer les ligne de 1 à 63 :

              sed '1,63d' nb_ligne.txt >nb_ligne_sans_entete.txt



              Récupérer le premier champ avec : pour délimiteur

              cut -d ":" -f 1 nb_ligne_sans_entete.txt >ligne.txt



              Ensuite je pense qu'il faudrait un script comme celui qui suit mais il ne fait pas ce que je veux :

              while read line
              
              do
              
              sed -n "$line p" GQPDOMB_verifie.vcf
              
              done < ligne.txt




              -
              Edité par Amandine Lecerf Defer 2 mai 2019 à 17:46:58

              • Partager sur Facebook
              • Partager sur Twitter

              Amandine,  Licence de Biologie, Master de Bioinformatique, en formation de Data Scientist

                2 mai 2019 à 19:43:22

                Bonjour,

                Il serait bon de donner un échantillon représentatif de tout le fichier (on peut pas deviner l'en-tête du fichier).

                Cela étant dit, l'idée de @0x223252 est bonne.

                Je pense que celle-ci devrait fonctionner (regex quasi équivalente):

                sed -n -r '64, /^([[:alnum:]]+[[:blank:]]+){2}\./p' file

                -
                Edité par KoaTao 2 mai 2019 à 19:46:11

                • Partager sur Facebook
                • Partager sur Twitter
                  2 mai 2019 à 23:51:19

                  salut,

                  qui dit colonnes, dit awk

                  awk '$3!="."' fichier


                  c'est tout.

                  • Partager sur Facebook
                  • Partager sur Twitter

                  Validez la réponse utile « Un problème clairement exposé est à moitié résolu. » Pas de MP technique

                  suppression de ligne dans un fichieren fontion

                  × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
                  × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
                  • Editeur
                  • Markdown