Suppression de ligne dans fichier selon pattern dans colonne précise
Résolu
irishupk
Messages postés
27
Statut
Membre
-
irishupk -
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 :
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 :
Donc au final je souhaite supprimer toutes les lignes avec . dans la troisième colonne.
voilà ce que j'ai entre autre essayé :
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 :
Supprimer les ligne de 1 à 63 :
Récupérer le premier champ avec : pour délimiteur
Ensuite je pense qu'il faudrait un script comme celui qui suit mais il ne fait pas ce que je veux :
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
A voir également:
- Suppression de ligne dans fichier selon pattern dans colonne précise
- Forcer suppression fichier - Guide
- Fichier bin - Guide
- Fichier epub - Guide
- Déplacer colonne excel - Guide
- Fichier rar - Guide
1 réponse
Salut,
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.
$ 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.
irishupk
Messages postés
27
Statut
Membre
1
Je te remercie énormément, c'est pile ce que je voulais ! Merci ! (tu me libère de plusieures heures de recherches !)
lEprofSonDkon
Messages postés
227
Statut
Membre
13
KISS!
irishupk
>
lEprofSonDkon
Messages postés
227
Statut
Membre
Merci pour cette autre solution !