extraire un sous-set de lignes d'un grand file text

J'ai un grand file avec 9 colonnes, délimité par des tabulations. Ce file est d'environ 39 Mo, avec environ 250 000 lignes. La dernière colonne, la colonne 9, contient des informations comme celle-ci (notez qu'il s'agit d'une seule colonne – ces espaces ne dénotent pas une nouvelle colonne mais sont simplement les "données" de cette colonne)

TF_binding_site_cage_181208 ZNFN1A2-91741 ;ALIAS ZNFN1A2 ;L3_ID L3_chrX_+_149850517 TF_binding_site_cage_181208 ZNFN1A2-92447 ;ALIAS ZNFN1A2 ;L3_ID L3_chrX_-_153016326 TF_binding_site_cage_181208 ZNFN1A2-92446 ;ALIAS ZNFN1A2 ;L3_ID L3_chrX_-_153016326 TF_binding_site_cage_181208 ZNFN1A2-92445 ;ALIAS ZNFN1A2 ;L3_ID L3_chrX_-_153016326 TF_binding_site_cage_181208 SNAI1-3-177789 ;ALIAS SNAI1,SNAI2,SNAI3 ;L3_ID L3_chr1_+_52294530 TF_binding_site_cage_181208 SNAI1-3-178434 ;ALIAS SNAI1,SNAI2,SNAI3 ;L3_ID L3_chr1_-_52294717 TF_binding_site_cage_181208 SNAI1-3-178161 ;ALIAS SNAI1,SNAI2,SNAI3 ;L3_ID L3_chr1_-_52604408 TF_binding_site_cage_181208 SNAI1-3-177489 ;ALIAS SNAI1,SNAI2,SNAI3 ;L3_ID L3_chr1_-_52936367 TF_binding_site_cage_181208 MEF2A,C,D-173519 ;ALIAS MEF2A,MEF2C,MEF2D ;L3_ID L3_chr8_+_144711658 TF_binding_site_cage_181208 MEF2A,C,D-173496 ;ALIAS MEF2A,MEF2C,MEF2D ;L3_ID L3_chr8_-_145085726 TF_binding_site_cage_181208 MEF2A,C,D-172831 ;ALIAS MEF2A,MEF2C,MEF2D ;L3_ID L3_chr8_+_145136211 TF_binding_site_cage_181208 MEF2A,C,D-173254 ;ALIAS MEF2A,MEF2C,MEF2D ;L3_ID L3_chr9_+_696759 

Fondamentalement, je cherche les lignes qui ne contiennent que "MEF2 *" donc dans l'exemple ci-dessus, il ne ferait que sélectionner les 4 dernières lignes. Je veux aussi toutes les lignes, pas seulement cette colonne.

J'ai essayé ça, importer sur Excel, importer sur R mais parfois ma méthode fonctionne MAIS je crains de n'avoir aucun moyen de "vérifier" si j'ai toutes mes lignes. (Les lignes avec MEF2 en eux couvrent quelques milliers de lignes donc c'est difficile de countr manuellement).

Quelqu'un peut-il penser à un algorithm qui m'aidera à extraire ces lignes sans (très peu) marge d'erreur? Je sais que cela semble être une chose fondamentale, mais j'ai peur que mes compétences regex ne soient pas assez fortes pour extraire toutes les lignes.

Cela vous donnera toutes les lignes dont la 9ème colonne correspond à MEF2 :

 awk -F"\t" '$9~/MEF2/' file > output 

En supposant que votre file est toujours délimité par des tabulations, cela fonctionnera et vous pourrez vous reposer en toute security. C'est aussi proche de 0 marge d'erreur que vous obtiendrez jamais.

Cependant, si vous avez essayé d'importer quelque chose comme R (sans doute en utilisant read.table("file",sep="\t") ), cela pourrait ne pas fonctionner. la fin pour savoir comment vérifier cela). Si c'est le cas, en supposant que vous êtes toujours intéressé par le dernier champ, vous pouvez utiliser $(NF) dans awk pour imprimer le dernier champ, peu importe le nombre de champs:

 awk -F"\t" '$(NF)~/MEF2/' file > output 

Si vous avez toujours besoin de vérifier, vous pouvez simplement extraire toutes les lignes qui correspondent à MEF2 , quel que soit l'endroit où elles se trouvent, puis comparer les résultats:

 grep MEF2 file > output2 

Une fois que vous avez cela, vous pouvez utiliser wc pour vérifier s'ils ont le même nombre de lignes. S'ils ne le font pas, trouvez où ils diffèrent en exécutant

 grep -vFf output output2 

Cette command imprimera toutes les lignes de la sortie2 qui ne sont pas présentes dans output1. S'il y en a, ils auront probablement MEF2 quelque part dans la ligne mais pas dans le 9ème champ. Si c'est dans le champ 9, vous savez que votre file n'est pas séparé par une tabulation et qu'il y a un problème avec vos données.


L' awk ci-dessus est probablement la solution la plus simple mais voici quelques autres qui font la même chose:

  • Perl

     perl -F"\t" -lane '$F[8]=~/MEF2/ && print' file 
  • sed (celui-ci pourrait correspondre aux mauvaises lignes si vous avez plus de 9 champs)

     sed -n '/\t.*\t.*\t.*\t.*\t.*\t.*\t.*\t.*MEF2.*/p' file 
  • grep

     grep -P '^.+?\t.*\t.*\t.*\t.*\t.*\t.*\t.*\t.*MEF2.*' file 

Si ceux-ci ne produisent pas tous la même sortie, vous savez qu'il y a un problème avec votre file. Une autre chose que vous pouvez vérifier est de s'assurer que toutes vos lignes ont 9 champs. Si ce n'est pas le cas, vous savez qu'il y a un problème:

 awk -F"\t" 'NF!=9' file 

Ce qui précède imprimera toutes les lignes qui n'ont pas exactement 9 champs séparés par des tabulations. S'il y a sortie, les lignes imprimées sont problématiques.