Trier fichier avec sed, sortie dans 2 fichiers
Résolu
marwai
Messages postés
8
Date d'inscription
Statut
Membre
Dernière intervention
-
dubcek Messages postés 18789 Date d'inscription Statut Contributeur Dernière intervention -
dubcek Messages postés 18789 Date d'inscription Statut Contributeur Dernière intervention -
Bonjour,
Je démarre un peu en shell et je me casse la tête depuis un moment sur ce problème:
j'ai le fichier ci-dessous
@_5:1:7:9569:21200/1
CAGAATGCCGTGGAACTGAAACGTCTGGC
+
CCCFFFFFHHHHHJJJJIJJIHIJJIJJI
@_5:1:7:9569:21200/2
GCACCATCATCACCGGTTCCGGGCAGCGC
+
CCCFFFFFHHFHHJJJGHJJJJJJJIGGI
@_5:1:11:12099:7543/1
CAGAATGCCGTGGAACTGAAACGTCTGGC
Je dois écrire dans un fichier "read1" les lignes en gras, et dans "read2" les lignes en italique.
La contrainte c'est que je dois le faire en une seule ligne. pour l'instant je fonctionne en cherchant le motf "/1" et en voulant écrire dans read1 la ligne en question + les 3 suivantes. (et dans le principe idem pour le motif "/2"
et en essayant de faire ça avec ce code
@_5:1:7:9569:21200/1
CAGAATGCCGTGGAACTGAAACGTCTGGC
+
CCCFFFFFHHHHHJJJJIJJIHIJJIJJI
GCACCATCATCACCGGTTCCGGGCAGCGC
+
CCCFFFFFHHFHHJJJGHJJJJJJJIGGI
CAGAATGCCGTGGAACTGAAACGTCTGGC
D'autre part je ne sais pas comment en une seule ligne traiter mes deux recherches et les deux sorties. Pour l'instant je fonctionne avec sed, mais si vous avez d'autres solutions je suis preneuse ^^
Je suis d'avance désolée si ma question est redondante, mais après avoir parcouru les sujets sur le forum shell je n'ai pas trouvé, ou alors pas compris, la réponse à mon problème.
Vous remerciant tous/toutes d'avance
Marwai
Je démarre un peu en shell et je me casse la tête depuis un moment sur ce problème:
j'ai le fichier ci-dessous
@_5:1:7:9569:21200/1
CAGAATGCCGTGGAACTGAAACGTCTGGC
+
CCCFFFFFHHHHHJJJJIJJIHIJJIJJI
@_5:1:7:9569:21200/2
GCACCATCATCACCGGTTCCGGGCAGCGC
+
CCCFFFFFHHFHHJJJGHJJJJJJJIGGI
@_5:1:11:12099:7543/1
CAGAATGCCGTGGAACTGAAACGTCTGGC
Je dois écrire dans un fichier "read1" les lignes en gras, et dans "read2" les lignes en italique.
La contrainte c'est que je dois le faire en une seule ligne. pour l'instant je fonctionne en cherchant le motf "/1" et en voulant écrire dans read1 la ligne en question + les 3 suivantes. (et dans le principe idem pour le motif "/2"
et en essayant de faire ça avec ce code
cat 'interleaved.fq' | sed -e '/\/1/ n;n;n;n;d' > read1.fqj'obtiens le résultat suivant
@_5:1:7:9569:21200/1
CAGAATGCCGTGGAACTGAAACGTCTGGC
+
CCCFFFFFHHHHHJJJJIJJIHIJJIJJI
GCACCATCATCACCGGTTCCGGGCAGCGC
+
CCCFFFFFHHFHHJJJGHJJJJJJJIGGI
CAGAATGCCGTGGAACTGAAACGTCTGGC
D'autre part je ne sais pas comment en une seule ligne traiter mes deux recherches et les deux sorties. Pour l'instant je fonctionne avec sed, mais si vous avez d'autres solutions je suis preneuse ^^
Je suis d'avance désolée si ma question est redondante, mais après avoir parcouru les sujets sur le forum shell je n'ai pas trouvé, ou alors pas compris, la réponse à mon problème.
Vous remerciant tous/toutes d'avance
Marwai
A voir également:
- Trier fichier avec sed, sortie dans 2 fichiers
- Fichier bin - Guide
- Fichier epub - Guide
- Fichier rar - Guide
- Comment réduire la taille d'un fichier - Guide
- Fichier .dat - Guide
5 réponses
hello
avec awk en 1 ligne
avec awk en 1 ligne
$ awk '/\/1$/ {f=1} /\/2$/ {f=2} {print > "read" f}' fichier
$ more read*
::::::::::::::
read1
::::::::::::::
@_5:1:7:9569:21200/1
CAGAATGCCGTGGAACTGAAACGTCTGGC
+
CCCFFFFFHHHHHJJJJIJJIHIJJIJJI
@_5:1:11:12099:7543/1
CAGAATGCCGTGGAACTGAAACGTCTGGC
::::::::::::::
read2
::::::::::::::
@_5:1:7:9569:21200/2
GCACCATCATCACCGGTTCCGGGCAGCGC
+
CCCFFFFFHHFHHJJJGHJJJJJJJIGGI
$
Salut,
Avec
Déjà parce qu'il te faut écrire dans 2 fichiers séparément et ça avec une redirection en une seule fois ce n'est pas possible.
Ensuite, la seule façon d'écrire d'écrire dans un fichier avec
Par contre avec une fichier de script (ou depuis un terminal mais sur plusieurs lignes) c'est possible :
Le fichier de référence :
Le script sed :
La commande :
Le contenu des 2 fichirs :
Avec
sedet en une seule ligne tu ne pourras pas.
Déjà parce qu'il te faut écrire dans 2 fichiers séparément et ça avec une redirection en une seule fois ce n'est pas possible.
Ensuite, la seule façon d'écrire d'écrire dans un fichier avec
sedc'est en utilisant la commande "w" (write), qui a un inconvénient, c'est que le seul paramètre autorisé derrière la commande c'est le nom du fichier. Donc sur une seule ligne ce n'est pas possible directement.
Par contre avec une fichier de script (ou depuis un terminal mais sur plusieurs lignes) c'est possible :
Le fichier de référence :
$ cat plop
@_5:1:7:9569:21200/1
CAGAATGCCGTGGAACTGAAACGTCTGGC
+
CCCFFFFFHHHHHJJJJIJJIHIJJIJJI
@_5:1:7:9569:21200/2
GCACCATCATCACCGGTTCCGGGCAGCGC
+
CCCFFFFFHHFHHJJJGHJJJJJJJIGGI
@_5:1:11:12099:7543/1
CAGAATGCCGTGGAACTGAAACGTCTGGC
Le script sed :
$ cat script.sed
#n
/\/1$/,+3{
w f1
}
/\/2$/,+3{
w f2
}
La commande :
$ sed -f script.sed plop
Le contenu des 2 fichirs :
$ cat f1
@_5:1:7:9569:21200/1
CAGAATGCCGTGGAACTGAAACGTCTGGC
+
CCCFFFFFHHHHHJJJJIJJIHIJJIJJI
@_5:1:11:12099:7543/1
CAGAATGCCGTGGAACTGAAACGTCTGGC
$ cat f2
@_5:1:7:9569:21200/2
GCACCATCATCACCGGTTCCGGGCAGCGC
+
CCCFFFFFHHFHHJJJGHJJJJJJJIGGI
Merci beaucoup pour ta réponse rapide! Ca fait plaisir ^^
Merci également pour le code. Je comprends mieux maintenant.
Ca marche nickel avec le script sed, j'ai juste enlevé le $ dans le motif: je ne sais pas pourquoi mais quand il y est les fichiers sont vides. Je me demande si ça ne viendrait pas du fichier de base, genre un problème sur le caractère de saut/retour de ligne. Enfin, dans mon cas ça ne devrait pas trop poser de problèmes puisque ce motif ne se retrouve qu'une seule fois dans une ligne lorsqu'il est présent.
En tout cas encore un grand merci!
Merci également pour le code. Je comprends mieux maintenant.
Ca marche nickel avec le script sed, j'ai juste enlevé le $ dans le motif: je ne sais pas pourquoi mais quand il y est les fichiers sont vides. Je me demande si ça ne viendrait pas du fichier de base, genre un problème sur le caractère de saut/retour de ligne. Enfin, dans mon cas ça ne devrait pas trop poser de problèmes puisque ce motif ne se retrouve qu'une seule fois dans une ligne lorsqu'il est présent.
En tout cas encore un grand merci!
Je me demande si ça ne viendrait pas du fichier de base, genre un problème sur le caractère de saut/retour de ligne.Pour le savoir il te faut afficher les caractères non-imprimables avec un
cat -A fichierpar exemple.
Mais bon, si c'est inutile de tester la fin de ligne, pas la peine de s'embêter ;-)
Oui, en effet, pas la peine de s'embêter.
Je me posais juste une question supplémentaire sur le nom des fichiers après la commande "w": est-ce qu'il est possible que ces noms de fichiers soient fonction du paramètre après "-f" lors de l'appel du script?
ex: script.sed -f plop
et avoir plop1 et plop2
?
Je me posais juste une question supplémentaire sur le nom des fichiers après la commande "w": est-ce qu'il est possible que ces noms de fichiers soient fonction du paramètre après "-f" lors de l'appel du script?
ex: script.sed -f plop
et avoir plop1 et plop2
?
Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre question
Ok, merci beaucoup ^^
J'avais une erreur dans mon script bash avec ton code, mais maintenant ça fonctionne (j'avais du rajouter ou enlever un espace quelque part =s ). Du coup je vais regarder ça en bash.
En tout cas encore merci! C'était une question pour un potentiel job, si jamais ça marche ça sera grâce à toi ;)
J'avais une erreur dans mon script bash avec ton code, mais maintenant ça fonctionne (j'avais du rajouter ou enlever un espace quelque part =s ). Du coup je vais regarder ça en bash.
En tout cas encore merci! C'était une question pour un potentiel job, si jamais ça marche ça sera grâce à toi ;)