cat peptides.txt | while read line
do
# do something with $line here
done
et la variante à une ligne :
cat peptides.txt | while read line; do something_with_$line_here; done
Ces options sauteront la dernière ligne du fichier s'il n'y a pas de saut de ligne à la fin.
Vous pouvez éviter cela en procédant comme suit :
cat peptides.txt | while read line || [[ -n $line ]];
do
# do something with $line here
done
Option 1a : Boucle While :Une seule ligne à la fois :Redirection d'entrée
#!/bin/bash
filename='peptides.txt'
echo Start
while read p; do
echo "$p"
done < "$filename"
Option 1b : Boucle While :Une seule ligne à la fois :
Ouvrez le fichier, lisez à partir d'un descripteur de fichier (dans ce cas, le descripteur de fichier #4).
#!/bin/bash
filename='peptides.txt'
exec 4<"$filename"
echo Start
while read -u4 p ; do
echo "$p"
done
Ce n'est pas mieux que les autres réponses, mais c'est une autre façon de faire le travail dans un fichier sans espaces (voir les commentaires). Je constate que j'ai souvent besoin de lignes simples pour parcourir des listes dans des fichiers texte sans l'étape supplémentaire consistant à utiliser des fichiers de script séparés.
for word in $(cat peptides.txt); do echo $word; done
Ce format me permet de tout mettre dans une seule ligne de commande. Remplacez la partie "echo $word" par ce que vous voulez et vous pouvez émettre plusieurs commandes séparées par des points-virgules. L'exemple suivant utilise le contenu du fichier comme arguments dans deux autres scripts que vous avez peut-être écrits.
for word in $(cat peptides.txt); do cmd_a.sh $word; cmd_b.py $word; done
Ou si vous avez l'intention de l'utiliser comme un éditeur de flux (learn sed), vous pouvez vider la sortie dans un autre fichier comme suit.
for word in $(cat peptides.txt); do cmd_a.sh $word; cmd_b.py $word; done > outfile.txt
Je les ai utilisés comme écrit ci-dessus parce que j'ai utilisé des fichiers texte où je les ai créés avec un mot par ligne. (Voir les commentaires) Si vous avez des espaces que vous ne voulez pas diviser vos mots/lignes, cela devient un peu plus moche, mais la même commande fonctionne toujours comme suit :
OLDIFS=$IFS; IFS=$'\n'; for line in $(cat peptides.txt); do cmd_a.sh $line; cmd_b.py $line; done > outfile.txt; IFS=$OLDIFS
Cela indique simplement au shell de se diviser uniquement sur les nouvelles lignes, pas sur les espaces, puis renvoie l'environnement à ce qu'il était auparavant. À ce stade, vous voudrez peut-être envisager de tout mettre dans un script shell plutôt que de tout compresser sur une seule ligne.
Bonne chance !
Une façon de le faire est :
while read p; do
echo "$p"
done <peptides.txt
Comme indiqué dans les commentaires, cela a pour effets secondaires de couper les espaces blancs de début, d'interpréter les séquences de barres obliques inverses et de sauter la dernière ligne s'il manque un saut de ligne de fin. S'il s'agit de problèmes, vous pouvez :
while IFS="" read -r p || [ -n "$p" ]
do
printf '%s\n' "$p"
done < peptides.txt
Exceptionnellement, si le corps de la boucle peut lire à partir de l'entrée standard, vous pouvez ouvrir le fichier en utilisant un descripteur de fichier différent :
while read -u 10 p; do
...
done 10<peptides.txt
Ici, 10 est juste un nombre arbitraire (différent de 0, 1, 2).