IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Shell et commandes GNU Discussion :

Modification fichier texte et recherche recursive de noms espacés par tabulation


Sujet :

Shell et commandes GNU

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Candidat au Club
    Femme Profil pro
    Étudiant
    Inscrit en
    Février 2016
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 32
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2016
    Messages : 3
    Par défaut Modification fichier texte et recherche recursive de noms espacés par tabulation
    Bonjour,

    dans le cadre de mon stage j'aimerai modifier un fichier à ma convenance pour le traiter par la suite en python, débutante en bash depuis ce matin, tout ne marche pas comme je veux >.< :

    le fichier de départ ressemble à :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    22 0|71 ENSGGOP00000021128 ENSCJAP00000039513 ENSMUSP00000023509 ENSRNOP00000050815
    21 0|69 ENSGGOP00000021128 ENSCJAP00000039513 ENSMUSP00000023509 ENSRNOP00000050815
    17 0|65 ENSGGOP00000021128 ENSCJAP00000039513
    15 0|63 ENSGGOP00000021128
    11 0|61 ENSGGOP00000021128
    10 ENSGGOP00000021128
    16 ENSCJAP00000039513
    20 0|68 ENSMUSP00000023509 ENSRNOP00000050815
    18 ENSMUSP00000023509
    19 ENSRNOP00000050815
    La première colonne correspond au nom de l'espèce (1 à 22). La deuxième colonne au nom du gène dans cette espèce, de type x|x, xx|x, ... xxxx|xxxx. Les autres colonnes correspondent au nom du gène dans les espèces actuelles descendantes de celle-ci (type : ENSCJA.......).

    Je veux récupérer parcourir le fichier ligne par ligne et remplacer UNE fois le nom du gène de l'espèce i chez son ancêtre (une des lignes qui précède). En gros, l'espèce 21 a un gène 0|69 qui correspond aux gènes "ENSGGOP00000021128 ENSCJAP00000039513 ENSMUSP00000023509 ENSRNOP00000050815", je veux récupérer le nom "0|69" et le remplacer à sa première occurrence c'est-à-dire l'espèce 22 0|71 pour obtenir : "22 0|71 0|69".

    Je veux obtenir :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    22 0|71 0|69
    21 0|69 0|65 0|68
    17 0|65 0|63 ENSCJAP00000039513
    15 0|63 0|61
    11 0|61 ENSGGOP00000021128
    10 ENSGGOP00000021128
    16 ENSCJAP00000039513
    20 0|68 ENSMUSP00000023509 ENSRNOP00000050815
    18 ENSMUSP00000023509
    19 ENSRNOP00000050815
    Le fichier fais 340 000 lignes, le séparateur dans le fichier source est la tabulation.

    Voici mon code mais il ne me modifie pas les noms de gènes par le nom "xxxx|xxxx" (avec x étant des chiffres). J'ai vu qu'il existait le awk mais pas si simple (>.<)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
     
    #! /bin/bash
    expand -t 1 OUTPUT > OUTPUT2 
    val=10
    while read ligne
    do
    	nom=$(echo "$ligne" | cut -f2 -d' ' )   # awk {'print $2'}
    	gene=$(echo "$ligne" | cut -f3- -d' ')
     
    	if [ "${#nom}" -lt "$val" ]
    	then
    		echo "$nom"
    		#echo "$gene"
    		sed -i 's/$gene/$nom/' OUTPUT2
    	fi
    done <OUTPUT2
    sed 's/ /\t/' OUTPUT2
    Si quelqu'un peut m'aider s'il vous plaît !!

  2. #2
    Modérateur
    Avatar de N_BaH
    Profil pro
    Inscrit en
    Février 2008
    Messages
    7 664
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 7 664
    Par défaut
    Bonjour,

    je vais botter en touche :
    modifier un fichier à ma convenance pour le traiter par la suite en python
    attaque le problème directement en python !

    l'ordre du fichier original doit-il être conserver ?
    N'oubliez pas de consulter les cours shell, la FAQ, et les pages man.

  3. #3
    Expert confirmé Avatar de disedorgue
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Décembre 2012
    Messages
    4 358
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur intégration
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Décembre 2012
    Messages : 4 358
    Par défaut
    Bonjour et Bienvenue,

    As-tu au moins un algo à proposer de comment faire ça ?

    En tout cas, cela semble un bon exercice

  4. #4
    Candidat au Club
    Femme Profil pro
    Étudiant
    Inscrit en
    Février 2016
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 32
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2016
    Messages : 3
    Par défaut
    Bonjour

    attaque le problème directement en python !
    l'ordre du fichier original doit-il être conserver ?
    J'ai déjà essayé mais cela me paraît plus simple de rechercher du texte avec grep ou sed pour le remplacer plutôt qu'en python avec des listes ou dictionnaires ou autres puisque chaque ligne peut ou non être différente.

    L'ordre des lignes importe peu, tant que la ligne elle-même est correcte !


    As-tu au moins un algo à proposer de comment faire ça ?
    En tout cas, cela semble un bon exercice
    Je n'ai pas d'algorithme puisque ce n'est qu'un pré-traitement du fichier pour regrouper des informations. J'ai déjà mis le code que j'ai fait et j'ai mis un exemple de ce que c'est censé faire !! A vrai dire, ce n'est pas très compliqué mais je n'y arrive pas ...


    Sinon avec une vision simple :

    Chat 12|1 a1 a2 a3 a4 a5
    chien 13|52 a1 a2

    je veux récupérer "a1 a2", le chercher et le remplacer par le numero situé en colonne 2 ("13|52"). Pour obtenir :
    Chat 12|1 13|52 a3 a4 a5
    chien 13|52 a1 a2

  5. #5
    Expert confirmé Avatar de papajoker
    Homme Profil pro
    Développeur Web
    Inscrit en
    Septembre 2013
    Messages
    2 324
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nièvre (Bourgogne)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Septembre 2013
    Messages : 2 324
    Par défaut
    si je comprends bien il te faut un algo du type :

    1) (facultatif?) lire entièrement le fichier pour créer un tableau associatif :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     especes[ENSGGOP00000021128]="0|61"
     ...
     especes[ENSGGOP00000011177]="0|80"
    340 000 espèces !

    2) re-lire tout le fichier ligne a ligne et remplacer une colonne ou plusieurs colonnes si elle représente une espèce
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    while read ligne; do
          declare -a values=decomposer_colonnes($ligne)
          for e in values[@]; do
               # si ancêtre précède alors : especes[$colonne1]="$colonne2"
               # si colonne présente dans especes alors on remplace
               [[  -n  "${especes[$e]}" ]] && $ligne=remplace_value_by_espece ("$ligne" "$e"   "${especes[$e]}")
          done
    done
    note : si l'ancêtre précède, donc une seule lecture suffit (pas de 1-).

  6. #6
    Expert confirmé Avatar de BufferBob
    Profil pro
    responsable R&D vidage de truites
    Inscrit en
    Novembre 2010
    Messages
    3 041
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : responsable R&D vidage de truites

    Informations forums :
    Inscription : Novembre 2010
    Messages : 3 041
    Par défaut
    salut,

    Citation Envoyé par Shinane Voir le message
    Sinon avec une vision simple :
    Chat 12|1 a1 a2 a3 a4 a5
    (...)
    je veux récupérer "a1 a2"
    et si on trouve à la fois "a1", "a1 a2" et "a1 a2 a3", tu préfères lequel ?
    aussi est-ce que c'est possible de trouver "a3 a1 a2" par exemple, ou "a1 a3 a4" ?

    vu d'ici je plussoie très fortement N_BaH, c'est pas un truc à faire en bash le traitement est trop complexe, surtout s'il y a 340k lignes à traiter, mieux vaut partir directement sur du python

  7. #7
    Expert confirmé Avatar de disedorgue
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Décembre 2012
    Messages
    4 358
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur intégration
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Décembre 2012
    Messages : 4 358
    Par défaut
    On pourrait le faire en shell, mais tu risques d'avoir ton résultat qu'au bout d'une journée.

    En tout cas, tu dis que tu n'as pas d'algo et que c'est simple, donc pourquoi ne pas le faire directement en python (comme on te la suggéré dés le départ) ?

    Pour faciliter ton parsing du fichier, tu peux à la rigueur juste réordonner celui-ci pour avoir une décroissance du nombre de colonne, ce qui donnerait un fichier réordonné comme ci-dessous (selon ton premier fichier exemple):
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    22 0|71 ENSGGOP00000021128 ENSCJAP00000039513 ENSMUSP00000023509 ENSRNOP00000050815
    21 0|69 ENSGGOP00000021128 ENSCJAP00000039513 ENSMUSP00000023509 ENSRNOP00000050815
    20 0|68 ENSMUSP00000023509 ENSRNOP00000050815
    17 0|65 ENSGGOP00000021128 ENSCJAP00000039513
    15 0|63 ENSGGOP00000021128
    11 0|61 ENSGGOP00000021128
    19 ENSRNOP00000050815
    18 ENSMUSP00000023509
    16 ENSCJAP00000039513
    10 ENSGGOP00000021128

Discussions similaires

  1. Modification fichier Texte
    Par toutou2000 dans le forum C#
    Réponses: 11
    Dernier message: 26/02/2010, 11h03
  2. Modification fichier texte base de donnée
    Par usermap dans le forum C#
    Réponses: 2
    Dernier message: 16/04/2009, 21h28
  3. Shell - Modification fichier texte
    Par bahaaldine dans le forum Shell et commandes GNU
    Réponses: 7
    Dernier message: 28/10/2007, 13h24
  4. Réponses: 6
    Dernier message: 15/12/2006, 19h29

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo