Πώς μπορώ να επαναλάβω κάθε γραμμή ενός αρχείου κειμένου με Bash;
Με αυτό το σενάριο:
echo "Start!"
for p in (peptides.txt)
do
echo "${p}"
done
Παίρνω αυτή την έξοδο στην οθόνη:
Start!
./runPep.sh: line 3: syntax error near unexpected token `('
./runPep.sh: line 3: `for p in (peptides.txt)'
(Αργότερα θέλω να κάνω κάτι πιο περίπλοκο με το $p
από την απλή έξοδο στην οθόνη).
Η μεταβλητή περιβάλλοντος SHELL είναι (από το env):
SHELL=/bin/bash
/bin/bash --version
έξοδος: /bin/bash --version
:
GNU bash, version 3.1.17(1)-release (x86_64-suse-linux-gnu)
Copyright (C) 2005 Free Software Foundation, Inc.
cat /proc/version
output:
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
Το αρχείο peptides.txt περιέχει:
RKEKNVQ
IPKKLLQK
QYFHQLEKMNVK
IPKKLLQK
GDLSTALEVAIDCYEK
QYFHQLEKMNVKIPENIYR
RKEKNVQ
VLAKHGKLQDAIN
ILGFMK
LEDVALQILL
Ένας τρόπος για να το κάνετε είναι:
while read p; do
echo "$p"
done <peptides.txt
Όπως επισημάνθηκε στα σχόλια, αυτό έχει τις παρενέργειες της περικοπής των αρχικών λευκών κενών, της ερμηνείας των ακολουθιών backslash και της παράλειψης της τελευταίας γραμμής αν λείπει ένα τερματικό linefeed. Αν αυτά είναι ανησυχίες, μπορείτε να κάνετε:
while IFS="" read -r p || [ -n "$p" ]
do
printf '%s\n' "$p"
done < peptides.txt
Κατ' εξαίρεση, εάν το σώμα του βρόχου μπορεί να διαβάζει από την τυπική είσοδο, μπορείτε να ανοίξετε το αρχείο χρησιμοποιώντας έναν διαφορετικό περιγραφέα αρχείου:
while read -u 10 p; do
...
done 10<peptides.txt
Εδώ, το 10 είναι απλά ένας αυθαίρετος αριθμός (διαφορετικός από το 0, 1, 2).
cat peptides.txt | while read line
do
# do something with $line here
done
και η παραλλαγή με ένα στίχο:
cat peptides.txt | while read line; do something_with_$line_here; done
Αυτές οι επιλογές θα παραλείψουν την τελευταία γραμμή του αρχείου αν δεν υπάρχει τροφοδοσία γραμμής στο τέλος.
Μπορείτε να το αποφύγετε αυτό με τα ακόλουθα:
cat peptides.txt | while read line || [[ -n $line ]];
do
# do something with $line here
done
Επιλογή 1α: Βρόχος While: Μία γραμμή κάθε φορά: Ανακατεύθυνση εισόδου
#!/bin/bash
filename='peptides.txt'
echo Start
while read p; do
echo $p
done < $filename
Επιλογή 1β: Βρόχος While: Μία γραμμή κάθε φορά: Ανοίξτε το αρχείο, διαβάστε από έναν περιγραφέα αρχείου (σε αυτή την περίπτωση περιγραφέας αρχείου #4).
#!/bin/bash
filename='peptides.txt'
exec 4<$filename
echo Start
while read -u4 p ; do
echo $p
done