2121 Stimmen

Schleifenbildung durch den Inhalt einer Datei in der Bash

Wie kann ich durch jede Zeile einer Textdatei iterieren mit Bash ?

Mit diesem Skript:

echo "Start!"
for p in (peptides.txt)
do
    echo "${p}"
done

Ich erhalte diese Ausgabe auf dem Bildschirm:

Start!
./runPep.sh: line 3: syntax error near unexpected token `('
./runPep.sh: line 3: `for p in (peptides.txt)'

(Später möchte ich etwas Komplizierteres machen mit $p als nur die Ausgabe auf dem Bildschirm).


Die Umgebungsvariable SHELL ist (von env):

SHELL=/bin/bash

/bin/bash --version Ausgabe:

GNU bash, version 3.1.17(1)-release (x86_64-suse-linux-gnu)
Copyright (C) 2005 Free Software Foundation, Inc.

cat /proc/version Ausgabe:

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

Die Datei peptides.txt enthält:

RKEKNVQ
IPKKLLQK
QYFHQLEKMNVK
IPKKLLQK
GDLSTALEVAIDCYEK
QYFHQLEKMNVKIPENIYR
RKEKNVQ
VLAKHGKLQDAIN
ILGFMK
LEDVALQILL

5voto

Sine Punkte 127
#!/bin/bash
#
# Change the file name from "test" to desired input file 
# (The comments in bash are prefixed with #'s)
for x in $(cat test.txt)
do
    echo $x
done

3voto

Whome Punkte 9949

Hier ist mein Beispiel aus dem wirklichen Leben, wie man Zeilen eines anderen Programms in einer Schleife ausgibt, nach Teilstrings sucht, doppelte Anführungszeichen aus Variablen entfernt und diese Variablen außerhalb der Schleife verwendet. Ich schätze, dass sich viele diese Fragen früher oder später stellen werden.

##Parse FPS from first video stream, drop quotes from fps variable
## streams.stream.0.codec_type="video"
## streams.stream.0.r_frame_rate="24000/1001"
## streams.stream.0.avg_frame_rate="24000/1001"
FPS=unknown
while read -r line; do
  if [[ $FPS == "unknown" ]] && [[ $line == *".codec_type=\"video\""* ]]; then
    echo ParseFPS $line
    FPS=parse
  fi
  if [[ $FPS == "parse" ]] && [[ $line == *".r_frame_rate="* ]]; then
    echo ParseFPS $line
    FPS=${line##*=}
    FPS="${FPS%\"}"
    FPS="${FPS#\"}"
  fi
done <<< "$(ffprobe -v quiet -print_format flat -show_format -show_streams -i "$input")"
if [ "$FPS" == "unknown" ] || [ "$FPS" == "parse" ]; then 
  echo ParseFPS Unknown frame rate
fi
echo Found $FPS

Variable außerhalb der Schleife deklarieren, Wert setzen und außerhalb der Schleife verwenden erfordert done <<< "$(...)" Syntax. Die Anwendung muss in einem Kontext mit der aktuellen Konsole ausgeführt werden. Anführungszeichen um den Befehl herum sorgen für Zeilenumbrüche im Ausgabestrom.

Schleifenabgleich für Teilzeichenfolgen liest dann name=Wert Paar, spaltet den rechten Teil des letzten \= Zeichen, entfällt das erste Anführungszeichen, entfällt das letzte Anführungszeichen, wir haben einen sauberen Wert, der anderweitig verwendet werden kann.

1voto

madD7 Punkte 663

Dies kommt ziemlich spät, aber mit dem Gedanken, dass es jemandem helfen könnte, füge ich die Antwort hinzu. Auch dies ist vielleicht nicht der beste Weg. head kann mit folgenden Befehlen verwendet werden -n Argument zu lesen n Linien vom Beginn der Datei an und ebenso tail Befehl kann zum Lesen von unten verwendet werden. Nun, um zu holen n-te Zeile aus der Datei, gehen wir n Linien die Daten über die Pipeline zu leiten, um nur 1 Zeile aus den über die Pipeline geleiteten Daten zu beenden.

   TOTAL_LINES=`wc -l $USER_FILE | cut -d " " -f1 `
   echo $TOTAL_LINES       # To validate total lines in the file

   for (( i=1 ; i <= $TOTAL_LINES; i++ ))
   do
      LINE=`head -n$i $USER_FILE | tail -n1`
      echo $LINE
   done

0voto

Alan Jebakumar Punkte 93

@Peter: Das könnte sich für Sie lohnen.

echo "Start!";for p in $(cat ./pep); do
echo $p
done

Dies würde die Ausgabe-

Start!
RKEKNVQ
IPKKLLQK
QYFHQLEKMNVK
IPKKLLQK
GDLSTALEVAIDCYEK
QYFHQLEKMNVKIPENIYR
RKEKNVQ
VLAKHGKLQDAIN
ILGFMK
LEDVALQILL

0voto

abhishek nair Punkte 308

Eine andere Möglichkeit, xargs zu verwenden, ist

<file_name | xargs -I {} echo {}

echo kann durch andere Befehle ersetzt oder weitergeleitet werden.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X