Suppression de ligne dans fichier selon pattern dans colonne précise

Résolu
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 :

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


Configuration: Windows / Firefox 60.0

1 réponse

  1. Contributeur
    Salut,

    $ awk '$3 !~ /\./ { print $0 }' fich 
    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


    Apparemment ton délimiteur de champs est la tabulation. Dans l'exemple de fichier que tu as mis, c'est l'espace. Donc à adapter à ton fichier.

    Si tu as une version de awk supérieure à 4.1.0, il existe la même fonctionnalité que "sed", à savoir l'option "--in-place" qui permet de modifier le fichier original; Sinon, il te faudra passer par un fichier temporaire.
    0
    1. Je te remercie énormément, c'est pile ce que je voulais ! Merci ! (tu me libère de plusieures heures de recherches !)
      0
    2. KISS!
      awk '$3!="."' fich
      0
    3. @lEprofSonDkonMerci pour cette autre solution !
      0