Hogyan iterálhatom végig egy szöveges fájl minden egyes sorát a Bash segítségével?
Ezzel a szkripttel:
echo "Start!"
for p in (peptides.txt)
do
echo "${p}"
done
Ezt a kimenetet kapom a képernyőn:
Start!
./runPep.sh: line 3: syntax error near unexpected token `('
./runPep.sh: line 3: `for p in (peptides.txt)'
(Később valami bonyolultabbat akarok csinálni a $p
-vel, mint csak a képernyőre való kimenet.)
A SHELL környezeti változó (az env-ből):
SHELL=/bin/bash
/bin/bash --version
kimenet:
GNU bash, version 3.1.17(1)-release (x86_64-suse-linux-gnu)
Copyright (C) 2005 Free Software Foundation, Inc.
cat /proc/verzió
kimenet: `}545454}..:
Linux version 2.6.18.2-34-default (geeko@buildhost) (gcc version 4.1.2 20061115 (prerelease) (SUSE Linux)) #1 SMP Mon Nov 27 11:46:27 UTC 2006
A peptides.txt fájl a következőket tartalmazza:
RKEKNVQ
IPKKLLQK
QYFHQLEKMNVK
IPKKLLQK
GDLSTALEVAIDCYEK
QYFHQLEKMNVKIPENIYR
RKEKNVQ
VLAKHGKLQDAIN
ILGFMK
LEDVALQILL
Ennek egyik módja a következő:
while read p; do
echo "$p"
done <peptides.txt
Amint a hozzászólásokban rámutattunk, ennek mellékhatása a vezető fehérjelek levágása, a backslash szekvenciák értelmezése, és az utolsó sor kihagyása, ha hiányzik belőle a befejező sorvég. Ha ezek aggályok, akkor megteheti:
while IFS="" read -r p || [ -n "$p" ]
do
printf '%s\n' "$p"
done < peptides.txt
Kivételesen, ha a ciklustest olvashat a standard bemenetről, akkor a fájlt egy másik fájlleíró segítségével nyithatja meg:
while read -u 10 p; do
...
done 10<peptides.txt
Itt a 10 csak egy tetszőleges szám (különbözik a 0-tól, 1-től, 2-től).
cat peptides.txt | while read line
do
# do something with $line here
done
és az egysoros változat:
cat peptides.txt | while read line; do something_with_$line_here; done
Ezek az opciók kihagyják a fájl utolsó sorát, ha nincs utána sorbetét.
Ezt a következőkkel elkerülheti:
cat peptides.txt | while read line || [[ -n $line ]];
do
# do something with $line here
done
1a. lehetőség: While ciklus: Egyszerre csak egy sor: Bemeneti átirányítás
#!/bin/bash
filename='peptides.txt'
echo Start
while read p; do
echo $p
done < $filename
1b. lehetőség: While ciklus: Egyszerre csak egy sor: Megnyitjuk a fájlt, olvasunk egy fájlleíróból (ebben az esetben a 4. számú fájlleíróból).
#!/bin/bash
filename='peptides.txt'
exec 4<$filename
echo Start
while read -u4 p ; do
echo $p
done