#1 Le 15/10/2008, à 16:59
- mezhoud
[résolu]Bioinformatic-concaténation texte-table
Bonjour Je souhaiterais bien extraire des données de deux fichiers qui ont les formes suivantes
fichier 1:
Query= gi|15805043|ref|NP_293727.1| DNA polymerase III, beta subunit
dip:DIP-13110N|refseq:NP_214516|uniprot:Q50790 129 8e-30
Query= gi|15805044|ref|NP_293728.1| chromosomal replication initiator
dip:DIP-41940N|uniprot:P05648 364 e-100
Il y a des retours chariots à la fin de chaque ligne.
les lignes sont couplées en deux Query+dip.
fichier2:
Composé d'une table de 11 colonnes espacées par une ou plusieurs tabulation
A la fin de chaque ligne il y a des retour chariot. voici un exemple:
ligne1- DIP-1E DIP-328N Q07817 NP_612815 DIP-232N Q07812 3 DIP-110851X:SS DIP-1X:SS DIP-93495X:SS
ligne2- DIP-2E DIP-1043N P10415 NP_000624 DIP-1048N P04049 NP_002871 3 DIP-108783X:HT DIP-76062X:SS DIP-2X:SS
But:
Récupérer du fichier 1: gi|15805043 (ligne1 fichier1) avec DIP-13110N (ligne2 fichier1)
apparié DIP-13110N dans la table du fichier 2.
et mettre le tout cad :
gi|15805043-DIP-13110N
la ligne de la table qui contient la chaine de caractère DIP-13110N
dans un 3ème fichier.
Est il comprehensible.
Merci pour votre aide
cordialement vôtre
Dernière modification par mezhoud (Le 20/10/2008, à 21:14)
Hors ligne
#2 Le 16/10/2008, à 19:34
- mezhoud
Re : [résolu]Bioinformatic-concaténation texte-table
Bonjour
M. Totor au secours
Hors ligne
#3 Le 17/10/2008, à 20:24
- Totor
Re : [résolu]Bioinformatic-concaténation texte-table
Bonsoir,
désolé mais j'ai une tonne de TAF en ce moment...
Je suis très peu sur le forum.
En considérant que fichier1 est constitué uniquement des lignes commençant par Query et dip:
voici un script :
#!/bin/bash
fichier1="fichier1"
fichier2="fichier2"
fichier3="fichier3"
[[ -f "${fichier3}" ]] && rm "${fichier3}"
while read ligne
do
if [ "${ligne}" =~ "^Query" ]; then
entete=$(echo "${ligne}"|sed 's/^Query=//'|awk -F\| '{ print $1"\|"$2 }')
fi
if [ "${ligne}" =~ "^dip:" ]; then
cle=$(echo "${ligne}"|sed 's/dip://'|awk -F\| '{ print $1 }')
echo "${entete}-${cle}" >> ${fichier3}
grep "$cle" ${fichier2} >> ${fichier3}
fi
done < ${fichier1}
Dernière modification par Totor (Le 17/10/2008, à 20:32)
-- Lucid Lynx --
Hors ligne
#4 Le 18/10/2008, à 16:49
- mezhoud
Re : [résolu]Bioinformatic-concaténation texte-table
Bonjour,
Merci beaucoup pour votre aide.
Comment exécuter une commande sur deux fichiers? ./cammande fichier1 fichier2?
J'ai rénommé mes fichiers "fichiers1" et "fichier2" ensuite j'ai exécuté le script sur le fichier 1 ensuite 2.
Le message d'erreur est le suivant:
"./cancatenation-chaine-caractere: line 22: fichier1: Aucun fichier ou répertoire de ce type"
La ligne 22 c'est la dernière ligne.
Dans le script je n'ai pas remarqué que la recherche doit sélectionner dans la ligne qui comence par Query, gi| et les 8 caractères qui suits dans la ligne qui commence par dip, DIP- et les 6 caractères qui suits.
merci beaucoup
Hors ligne
#5 Le 18/10/2008, à 17:30
- mezhoud
Re : [résolu]Bioinformatic-concaténation texte-table
Voici le script en Français.
on pourra séparer le travail en deux exercices:
le premier consiste à extraire du fichier 1 les deux chaine de caractères et les mettre dans un fichier3:
chercher dans un fichier1,
Si la ligne commence par Query, extraire gi|et les 8 caractères qui suits,
Si la ligne qui SUIT commence par dip, extraire DIP- et les 6 caractères qui suits,
cancaténer les deux résultats "gi|xxxxxxxx-DIP-xxxxxx " dans un fichier3 avec un retour chariot entre les résultat
exercice 2:
apparier gi|xxxxxxxx-DIP-xxxxxx avec le fichier2, si tu détecte un ligne contenant DIP-xxxxxx mettre dans un fichier4 le résultat comme suite:
gi|xxxxxxxx-DIP-xxxxxx retour chariot
ligne contenant DIP-xxxxxx retour chariot
Merci d'avance
Hors ligne
#6 Le 20/10/2008, à 21:13
- mezhoud
Re : [résolu]Bioinformatic-concaténation texte-table
Voici la solution postulée par Totor:
#!/bin/bash
fichier1="$1"
fichier2="$2"
fichier3="$3"
[[ -f "${fichier3}" ]] && rm "${fichier3}"
cat ${fichier1}|while read ligne
do
if [ -n "$(echo "${ligne}"|grep "Query")" ]; then
entete=$(echo "${ligne}"|sed 's/Query=[ ]\{0,1\}//'|awk -F\| '{ print $1"|"$2 }')
else
if [ -n "$(echo "${ligne}"|grep "^dip:")" ]; then
cle=$(echo "${ligne}"|sed 's/dip://'|awk -F\| '{ print $1 }')
echo "${entete}-${cle}" >> ${fichier3}
grep "$cle" ${fichier2} >> ${fichier3}
fi
fi
done
un grand merci
Hors ligne