GNU/Linux >> Tutoriels Linux >  >> Linux

Boucler le contenu d'un fichier dans Bash

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).


Linux
  1. Renommer un fichier dans le terminal Linux

  2. Pourquoi le script Bash ne reconnaît-il pas les alias ?

  3. Rediriger le contenu d'un fichier vers la commande "echo" ?

  4. La fête ?

  5. Renommer en masse le fichier Bash avec compteur ?

Comment afficher le contenu d'une sauvegarde du fichier de base de données Dconf ?

5 commandes pour afficher le contenu d'un fichier en ligne de commande Linux

Comment connaître le nom du fichier de script dans un script Bash ?

Bash :ajouter une chaîne à la fin du fichier sans saut de ligne

Comment vérifier si un fichier est vide dans Bash ?

Comment obtenir le répertoire absolu d'un fichier dans bash ?