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   -
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 18789 Date d'inscription   Statut Contributeur Dernière intervention   5 637
 
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   Statut Contributeur Dernière intervention   6 431
 
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   Statut Membre Dernière intervention  
 
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   Statut Contributeur Dernière intervention   6 431
 
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   Statut Membre Dernière intervention  
 
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   Statut Contributeur Dernière intervention   6 431
 
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   Statut Membre Dernière intervention  
 
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   Statut Contributeur Dernière intervention   6 431
 
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