cat peptides.txt | while read line
do
# do something with $line here
done
e la variante a una riga:
cat peptides.txt | while read line; do something_with_$line_here; done
Queste opzioni salteranno l'ultima riga del file se non c'è avanzamento riga finale.
Puoi evitarlo procedendo come segue:
cat peptides.txt | while read line || [[ -n $line ]];
do
# do something with $line here
done
Opzione 1a: Ciclo while:una riga alla volta:reindirizzamento dell'input
#!/bin/bash
filename='peptides.txt'
echo Start
while read p; do
echo "$p"
done < "$filename"
Opzione 1b: Ciclo while:riga singola alla volta:
Apri il file, leggi da un descrittore di file (in questo caso il descrittore di file n. 4).
#!/bin/bash
filename='peptides.txt'
exec 4<"$filename"
echo Start
while read -u4 p ; do
echo "$p"
done
Questo non è migliore di altre risposte, ma è un altro modo per portare a termine il lavoro in un file senza spazi (vedi commenti). Trovo che spesso ho bisogno di una riga per scavare negli elenchi nei file di testo senza il passaggio aggiuntivo di utilizzare file di script separati.
for word in $(cat peptides.txt); do echo $word; done
Questo formato mi consente di inserire tutto in una riga di comando. Cambia la parte "echo $word" in quello che vuoi e puoi emettere più comandi separati da punto e virgola. L'esempio seguente utilizza i contenuti del file come argomenti in altri due script che potresti aver scritto.
for word in $(cat peptides.txt); do cmd_a.sh $word; cmd_b.py $word; done
Oppure, se intendi usarlo come un editor di stream (impara sed), puoi scaricare l'output in un altro file come segue.
for word in $(cat peptides.txt); do cmd_a.sh $word; cmd_b.py $word; done > outfile.txt
Li ho usati come scritto sopra perché ho usato file di testo dove li ho creati con una parola per riga. (Vedi commenti) Se hai spazi che non vuoi dividere le tue parole/righe, diventa un po' più brutto, ma lo stesso comando funziona ancora come segue:
OLDIFS=$IFS; IFS=$'\n'; for line in $(cat peptides.txt); do cmd_a.sh $line; cmd_b.py $line; done > outfile.txt; IFS=$OLDIFS
Questo dice semplicemente alla shell di dividersi solo su nuove righe, non su spazi, quindi riporta l'ambiente a quello che era in precedenza. A questo punto, però, potresti prendere in considerazione l'idea di inserire tutto in uno script di shell piuttosto che comprimerlo tutto in una singola riga.
In bocca al lupo!
Un modo per farlo è:
while read p; do
echo "$p"
done <peptides.txt
Come sottolineato nei commenti, questo ha gli effetti collaterali di tagliare gli spazi bianchi iniziali, interpretare le sequenze di barre rovesciate e saltare l'ultima riga se manca un avanzamento riga di chiusura. Se queste sono preoccupazioni, puoi fare:
while IFS="" read -r p || [ -n "$p" ]
do
printf '%s\n' "$p"
done < peptides.txt
Eccezionalmente, se il corpo del ciclo può leggere dall'input standard, puoi aprire il file utilizzando un descrittore di file diverso:
while read -u 10 p; do
...
done 10<peptides.txt
Qui, 10 è solo un numero arbitrario (diverso da 0, 1, 2).