2012-03-12 3 views
1

Hey donc j'ai une commande bash qui résonne une chaîne basée sur la lecture de certains fichiers. Dites pour la simplicité, il est comme çaAppel de script externe dans matlab et capture de sortie

for line in `cat file` 
do 
if [ "$line" == "IwantThisLine" ] 
then 
echo "True" 
fi 
done 

Et je l'ai enregistré en tant que son propre script individuel. Son appelé readRef.sh. Alors maintenant je veux l'appeler dans matlab et stocker tout ce qu'il sort dans une variable! Je ne suis pas tout à fait sûr sur la façon de faire cela, je semble obtenir une erreur lors de l'utilisation de evalc() sur un système(). Mais ça pourrait être juste que je mette des citations en l'air.

J'ai essayé quelque chose comme

evalc(system(['./readRef.sh ' bamfile'])) 

Le « bamfile » est une variable qui est juste une chaîne sur le chemin d'un bamfile.

Je reçois cette erreur.

>> tes = evalc(system(['./readRef.sh ' smplBamFile])) 
hg18 
??? Undefined function or method 'evalc' for input arguments of type 'double'. 

Coïncidence, il ne crachait « hg18 » qui est ce que je veux mettre à la variable Matlab.

+1

Eh bien, pourriez-vous fournir les commandes 'evalc' /' system' que vous avez essayé d'exécuter le script et le message d'erreur qui l'accompagne? (En aparté - le script lui-même fonctionne-t-il lorsque vous l'exécutez depuis bash (ie 'sh./ReadRef.sh'?) Avez-vous défini le bit exécutable?) –

+0

Il semblerait que' smplBamFile' ne soit pas une chaîne de caractères - pourrait vous faites 'class (['./ readRef.sh' smplBamFile])'? –

+0

il est dit 'char'. –

Répondre

3

Oh, je vois. Je ne pense pas que vous ayez besoin de evalc du tout. La lecture du system docs vous pouvez juste faire:

[status, result] = system('echo True; echo "I got a loverly bunch of coconuts"') 

Et result sera

True 
I got a loverly bunch of coconuts 

Il suffit donc de faire:

[status, result] = system(['./readRef.sh ' smplBamFile]) 

La raison evalc ne fonctionne pas est qu'il nécessite son entrée être une expression Matlab dans une chaîne, mais vous le transmettez le résultat de system.

Vous pouvez essayer:

evalc("system(['./readRef.sh ' smplBamFile])") 

Voyez comment je passe dans le system(...) comme une chaîne?

+0

Oui j'ai déjà essayé de passer le système (...) sous forme de chaîne mais malheureusement cela m'a donné une erreur inattendue. Je vais essayer ce que vous avez dit et vous le faire savoir, merci. –

+1

Si vous avez essayé de le passer comme une chaîne aussi, alors mettez cette tentative et votre erreur dans la question.Chaque fois que vous posez une question, mettez * toutes * vos tentatives * et * les messages d'erreur associés - cela aidera grandement les personnes qui essaient de vous aider, et les empêchera de mal identifier votre problème comme quelque chose qu'il ne l'est pas. –

0

La raison pour laquelle vous obtenez cette erreur est que system(...) renvoie le code retour de la commande exécutée, et non sa sortie. Pour capturer sa sortie, utilisez

[~, output] = system(...) 
tes = evalc(output); 
Questions connexes