Contenu | Rechercher | Menus

Annonce

Si vous avez des soucis pour rester connecté, déconnectez-vous puis reconnectez-vous depuis ce lien en cochant la case
Me connecter automatiquement lors de mes prochaines visites.

À propos de l'équipe du forum.

#1 Le 16/06/2022, à 10:46

waver31

Extraire et sauvegarder des lignes différentes dans plusieurs fichiers

Bonjour, je suis novice dans la programmation en bash mais voilà ce que je tente de faire :
mon fichier de départ :
>Equus
agtcgatgtgggacc...
>Homo
agtcttgctgtgctg
etc ...

Ce que je souhaite réussir à faire : extraire la ligne commençant par > et la ligne suivante et stocker ces 2 lignes dans un fichier qui se nommerait Equus.fasta, Homo.fasta, etc j'obtiendrai donc autant de fichier en sortie que de ligne commençant par > dans mon premier fichier

Voilà le script que j'ai commencé à faire :

while read ligne : 
	NAME = `echo $line`
	zgrep -A 1 "^>" ${EQUUS} > ${REF}${NAME}.fasta
done

Merci pour votre aide

Dernière modification par waver31 (Le 16/06/2022, à 12:02)

Hors ligne

#2 Le 16/06/2022, à 12:06

pingouinux

Re : Extraire et sauvegarder des lignes différentes dans plusieurs fichiers

Bonjour,
Est-ce que  cette commande fait ce que tu veux ?

awk '{ if(substr($0,1,1)==">") {fic=sprintf("%s.fasta",substr($0,2)); ligs=$0;getline;ligs=sprintf("%s\n%s",ligs,$0);print ligs >fic}} ' fichier

Hors ligne

#3 Le 16/06/2022, à 12:09

MicP

Re : Extraire et sauvegarder des lignes différentes dans plusieurs fichiers

Bonjour

Si ton fichier de départ est nommé fichDepart.txt
essaye avec ça :

#!/bin/bash

while read ligne; do                       # Je lis ligne par ligne le contenu du fichier
    if [ "${ligne:0:1}" = ">" ]; then      # Si le premier caractère de la ligne est un >
        fichOut="${ligne:1}.fasta"           # J'enlève le premier caractère pour créer le nom du fichier .fasta
        read donnees                         # Je lis la ligne suivante et je la mets dans une variable nommée donnees
        echo "$donnees" > "$fichOut"         # Je créé le fichier dans lequel je mets les données lues précédemment
    fi
done < fichDepart.txt

Ce qui donne :

michel@debbull:~/aefff$ ls -l
total 4
-rw-r--r-- 1 michel michel 103 16 juin  12:40 fichDepart.txt
michel@debbull:~/aefff$ 
michel@debbull:~/aefff$ cat fichDepart.txt 
>Equus
agtcgatgtgggacc...
>Homo
agtcttgctgtgctg
etc ...

>Homer
gtcaaggcttgg
>marc
gttgaaccgctccaaagtc
michel@debbull:~/aefff$ 
michel@debbull:~/aefff$ while read l; do if [ "${l:0:1}" = ">" ]; then { f="${l:1}.fasta"; read d; echo "$d" > "$f"; }; fi; done < fichDepart.txt
michel@debbull:~/aefff$ 
michel@debbull:~/aefff$ ls -l
total 20
-rw-r--r-- 1 michel michel  19 16 juin  12:49 Equus.fasta
-rw-r--r-- 1 michel michel 103 16 juin  12:40 fichDepart.txt
-rw-r--r-- 1 michel michel  13 16 juin  12:49 Homer.fasta
-rw-r--r-- 1 michel michel  16 16 juin  12:49 Homo.fasta
-rw-r--r-- 1 michel michel  20 16 juin  12:49 marc.fasta
michel@debbull:~/aefff$ 
michel@debbull:~/aefff$ for f in *.fasta; do echo -e "fichier   : $f\ncontenant : $(cat "$f")\n"; done
fichier   : Equus.fasta
contenant : agtcgatgtgggacc...

fichier   : Homer.fasta
contenant : gtcaaggcttgg

fichier   : Homo.fasta
contenant : agtcttgctgtgctg

fichier   : marc.fasta
contenant : gttgaaccgctccaaagtc

michel@debbull:~/aefff$ 

Edit :
J'avais mal lu le sujet : il manque la copie de la première ligne dans les fichiers créés.

Dernière modification par MicP (Le 16/06/2022, à 16:45)

Hors ligne

#4 Le 16/06/2022, à 12:49

waver31

Re : Extraire et sauvegarder des lignes différentes dans plusieurs fichiers

Merci beaucoup à tous les deux,
la réponse de pingouinux fait exactement ce que je veux, si tu as le temps je veux bien une explicitation de ce que tu as fait.
Le script de MicP ne me donne en sortie que la deuxième ligne (c'est à dire la séquence) et pas la première ligne avec, or j'aurai aimé que dans mon fichier il y ait les 2. (merci d'avoir commenté le code c'est top).

Hors ligne

#5 Le 16/06/2022, à 12:54

Tawal

Re : Extraire et sauvegarder des lignes différentes dans plusieurs fichiers

Hello,

En bash et plus simple amha (mais même ordre d'idée) :

#!/bin/bash

while read nom; read datas
do
    FichOut="${nom:1}.fasta"
    echo -e "$nom\n$datas" > "$FichOut"
done < fichDepart.txt

Edit:
Je reprends la ligne de commande awk de pingouinux (dévellopếe sur plusieurs lignes) :

awk '
{
   if(substr($0,1,1)==">") {                  # test si le 1er caractère de la ligne lue est ">"
      fic=sprintf("%s.fasta",substr($0,2))    # Création du nom du fichier à sauvegarder
      ligs=$0                                 # Mémorisation de la ligne en cours
      getline                                 # Obtention d'une nouvelle ligne
      ligs=sprintf("%s\n%s",ligs,$0)          # Concaténation des 2 lignes (nom + datas)
      print ligs >fic                         # Enregistrement des lignes dans le fichier (création du fichier)
   }
} ' fichier

Dernière modification par Tawal (Le 16/06/2022, à 13:10)


Le savoir n'a d’intérêt que si on le transmet.
Useless Use of Cat Award
Filenames and Pathnames in Shell: How to do it Correctly
À chaque problème sa solution, à chaque solution son moyen, si pas de moyen, toujours le problème !

Hors ligne

#6 Le 16/06/2022, à 13:03

MicP

Re : Extraire et sauvegarder des lignes différentes dans plusieurs fichiers

Oui, c'est impec à condition d'être sûr que la première ligne du fichier est un nom,
et qu'il n'y a qu'une seule ligne (de données) entre chaque noms,

mais comme ces conditions n'avaient pas été précisées,
je me suis peut-être imposé des conditions superflues.

Hors ligne

#7 Le 16/06/2022, à 13:04

waver31

Re : Extraire et sauvegarder des lignes différentes dans plusieurs fichiers

Merci Tawal ça marche super bien aussi wink

Hors ligne

#8 Le 16/06/2022, à 13:11

Tawal

Re : Extraire et sauvegarder des lignes différentes dans plusieurs fichiers

Vois mon edit à mon message précédent, j'explique la commande awk wink


Le savoir n'a d’intérêt que si on le transmet.
Useless Use of Cat Award
Filenames and Pathnames in Shell: How to do it Correctly
À chaque problème sa solution, à chaque solution son moyen, si pas de moyen, toujours le problème !

Hors ligne

#9 Le 16/06/2022, à 14:00

pingouinux

Re : Extraire et sauvegarder des lignes différentes dans plusieurs fichiers

Merci Tawal pour l'explication de ma commande en #2..

Hors ligne