#1 Le 16/06/2022, à 09: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, à 11:02)
Hors ligne
#2 Le 16/06/2022, à 11: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, à 11: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, à 15:45)
Hors ligne
#4 Le 16/06/2022, à 11: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, à 11: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, à 12: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, à 12: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, à 12:04
- waver31
Re : Extraire et sauvegarder des lignes différentes dans plusieurs fichiers
Merci Tawal ça marche super bien aussi
Hors ligne
#8 Le 16/06/2022, à 12: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
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, à 13: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