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

[Résolu/Fermé]
Signaler
Messages postés
25
Date d'inscription
vendredi 13 avril 2018
Statut
Membre
Dernière intervention
29 juin 2020
-
 irishupk -
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

Messages postés
36299
Date d'inscription
dimanche 7 novembre 2010
Statut
Contributeur
Dernière intervention
27 janvier 2021
6 293
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.
Messages postés
25
Date d'inscription
vendredi 13 avril 2018
Statut
Membre
Dernière intervention
29 juin 2020

Je te remercie énormément, c'est pile ce que je voulais ! Merci ! (tu me libère de plusieures heures de recherches !)
Messages postés
209
Date d'inscription
jeudi 13 décembre 2018
Statut
Membre
Dernière intervention
27 septembre 2019
14
KISS!
awk '$3!="."' fich
>
Messages postés
209
Date d'inscription
jeudi 13 décembre 2018
Statut
Membre
Dernière intervention
27 septembre 2019

Merci pour cette autre solution !