Trier fichier avec sed, sortie dans 2 fichiers

Résolu/Fermé
marwai Messages postés 8 Date d'inscription samedi 15 février 2014 Statut Membre Dernière intervention 13 juillet 2014 - Modifié par marwai le 15/02/2014 à 16:58
dubcek Messages postés 18755 Date d'inscription lundi 15 janvier 2007 Statut Contributeur Dernière intervention 14 novembre 2024 - 16 févr. 2014 à 10:12
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
cat 'interleaved.fq' | sed -e '/\/1/ n;n;n;n;d' > read1.fq
j'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:

5 réponses

dubcek Messages postés 18755 Date d'inscription lundi 15 janvier 2007 Statut Contributeur Dernière intervention 14 novembre 2024 5 620
16 févr. 2014 à 10:12
hello
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
$
2
zipe31 Messages postés 36402 Date d'inscription dimanche 7 novembre 2010 Statut Contributeur Dernière intervention 27 janvier 2021 6 417
15 févr. 2014 à 17:20
Salut,

Avec
sed
et 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
sed
c'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

1
marwai Messages postés 8 Date d'inscription samedi 15 février 2014 Statut Membre Dernière intervention 13 juillet 2014
15 févr. 2014 à 18:07
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!
0
zipe31 Messages postés 36402 Date d'inscription dimanche 7 novembre 2010 Statut Contributeur Dernière intervention 27 janvier 2021 6 417
15 févr. 2014 à 18:10
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 fichier
par exemple.

Mais bon, si c'est inutile de tester la fin de ligne, pas la peine de s'embêter ;-)
0
marwai Messages postés 8 Date d'inscription samedi 15 février 2014 Statut Membre Dernière intervention 13 juillet 2014
15 févr. 2014 à 18:17
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
?
0
zipe31 Messages postés 36402 Date d'inscription dimanche 7 novembre 2010 Statut Contributeur Dernière intervention 27 janvier 2021 6 417
15 févr. 2014 à 18:22
Non, il faut les écrire en dur dans le fichier
script.sed
.

De plus, le paramètre
-f
sert à appeler le fichier contenant les instructions pour
sed
, donc rien à voir avec le fichier à traiter ;-\
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
marwai Messages postés 8 Date d'inscription samedi 15 février 2014 Statut Membre Dernière intervention 13 juillet 2014
15 févr. 2014 à 18:24
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 ;)
0
zipe31 Messages postés 36402 Date d'inscription dimanche 7 novembre 2010 Statut Contributeur Dernière intervention 27 janvier 2021 6 417
15 févr. 2014 à 18:28
C'était une question pour un potentiel job, si jamais ça marche ça sera grâce à toi ;)
Si ça ne marche pas pour toi, dis-leur que je suis libre ;-))

Bonne chance.
0