2012-06-26 1 views
0

J'ai un fichier que j'ai besoin d'analyser dans un tableau, mais je veux vraiment seulement une brève partie de chaque ligne et seulement pour les 84 premières lignes. la ligne peut-être parfois:Bash lire le fichier à un tableau basé sur deux délimiteurs

>MT gi... 

Et je voudrais juste veux que le MT à être entré dans le tableau. D'autres fois, il pourrait être quelque chose comme ceci:

>GL000207.1 dn... 

et je besoin du GL000207.1

Je pensais que vous pourriez être en mesure de mettre deux délimiteurs (étant le « > » et l'autre étant l'espace blanc), mais je ne suis pas sûr de la façon dont vous y arriveriez. J'ai lu des articles d'autres peuples sur le séparateur de champ interne mais je ne suis pas sûr de comment cela fonctionnerait. Je pense que quelque chose comme ça pourrait peut-être fonctionner?

desiredArray=$(echo file.whatever | tr ">" " ") 
for x in $desiredArray 
do 
    echo > $x 
done 

Une suggestion?

+0

Avez-vous essayé 'cut'? – Wrikken

+0

Euh. En fait, j'ai juste commencé avec Bash comme ... il y a une semaine. J'essaie de l'apprendre pour mon travail. Comment utilisez-vous couper? – Stephopolis

+0

Le shell est généralement médiocre au traitement de texte. Vous pourriez être compliqué avec 'IFS' mais vous feriez mieux d'utiliser' cut' comme suggéré ou 'awk' ou' perl'. – msw

Répondre

2

Que diriez-vous:

head -84 <file> | awk '{print $1}' | tr -d '>' 

head ne prend que les premières lignes du fichier, awk se déshabille le premier espace et tout ce qui suit, et tr se débarrasse de la « > ».

+0

Donc, essentiellement, ce que dit cette ligne de code ... Du début à la fin 84 d'un fichier particulier, prenez tout avant l'espace et supprimez le>? – Stephopolis

+0

C'est à peu près l'idée, oui. Bien qu'il y ait toujours des lignes où vous ne voulez pas le premier champ entier (moins le '>'), vous auriez besoin de quelques règles supplémentaires, mais les deux cas cités dans la question originale seraient résolus par ce modèle. – twalberg

+0

Je ne suis pas sûr de savoir comment cela fonctionne comme un tableau. Comment feriez-vous référence aux valeurs plus tard? – Stephopolis

0

Vous pouvez aussi le faire avec sed:

head -n 84 <file> | sed 's/>\([^ ]*\).*/\1/' 
+0

Sauf 'queue -n 84 ' donne les * dernières * lignes du fichier, pas les * premières * – twalberg

+0

o dear :) pas sûr pourquoi je suis entré dans la queue ... réparé maintenant. Merci de m'avoir signalé. – bcelary

+0

pas de soucis ... la plupart d'entre nous utilisent beaucoup plus la queue, c'est donc une erreur naturelle ... – twalberg

Questions connexes