Die Idee meiner Schleife besteht darin, die erste Ziffer jeder Zeile einer Datei auszudrucken. Die Datei ist diese:
256-56-8411 Bob 3.61 Junior CS
471-44-7458 Tim 3.45 Senior CE
326-56-4286 Rajesh 2.97 Freshman TE
548-66-1124 Eric 2.88 Sophomore EE
447-21-3599 John 2.51 Junior CS
911-41-1256 Rebecca 3.92 Senior CS
854-22-6372 Robin 2.45 Freshman TE
Und die Ausgabe nach dem Ausführen des Skripts lautet:
This is a script that analyses student data from input file students.txt
----------------------------------------------------------------------
./student_script: line 8: 2
4
3
5
4
9
8: No such file or directory
7 is the number of students in the input file.
Und schließlich lautet der Code:
echo "This is a script that analyses student data from input file $1"
echo "----------------------------------------------------------------------"
studentCount=`wc -l < $1 `
tempFile=`cut -c1 $1`
while read n
do
echo "$n"
done < $tempFile
echo "$studentCount is the number of students in the input file."
Nachdem ich dies behoben habe, möchte ich mithilfe der While-Schleife prüfen, ob die erste Ziffer eine Vier ist oder nicht und dann angeben, wie viele IDs (erste Spalte) nicht mit einer 4 beginnen.
Ich habe nichts dagegen, etwas über eine sauberere Lösung als meinen Ansatz zu lernen, aber das ist für einen Kurs und ich glaube nicht, dass wir viel davon gelernt haben. Während meiner Reise habe ich viele ähnliche Dinge mit awk gesehen, aber wir haben awk noch überhaupt nicht gelernt.
Aber ja, im Grunde habe ich alle gewünschten Daten aus meiner Schleife erhalten, außer dass diese zwei zusätzlichen Bits hinzugefügt wurden.
Antwort1
Was Sie in dieser Zeile geschrieben haben:
tempFile=`cut -c1 $1`
erstellt keine Datei mit dem Namen tempFile
. Daher können Sie nicht daraus lesen.
Sie können diese Zeile wie folgt ändern:
cut -c1 "$1" > tempFile
Und es tempFile
wird eine Datei mit dem Namen erstellt, die die while read
Schleife lesen kann. Verwenden Sie diese nicht $tempFile
in dieser Schleife, da die Variable $tempfile
null ist (nicht existiert). Verwenden Sie etwas wie (kein $):
done < tempFile
Der einfache Befehl schreibt jedoch cut -c1 "$1"
alle Anfangszeichen aus der Quelldatei. Führen Sie einfach Folgendes aus, um es anzuzeigen:
cut -c1 "sourcefile"
Wenn Sie das wissen, benötigen Sie keine temporäre Datei zum Speichern der Werte, sondern können einfach ein Here-Dokument verwenden.
Verwenden Sie hier ein Dokument und bereinigen Sie einige andere Probleme in Ihrem Skript:
#!/bin/sh
echo "This is a script that analyses student data from input file $1"
echo "----------------------------------------------------------------------"
studentCount="$(wc -l < "$1" )"
while read n
do
echo "$n"
done <<-_avoid_a_file_
$(cut -c1 "$1")
_avoid_a_file_
echo "$studentCount is the number of students in the input file."
Es empfiehlt sich, ein She-Bang (#!) zu verwenden, um anzugeben, welcher Interpreter den Code ausführen soll. In diesem Fall bin ich davon ausgegangen, dass Sie sh
aufgrund der Erwähnung von wollten Bourne shell
. Bitte beachten Sie, dass die ursprüngliche Bourne-Shell ziemlich alt ist (~1979) und dass neuere Shells (ksh, bash, mksh, zsh usw.) durch viele Verbesserungen ergänzt wurden.