
Okay, ich hoffe, das ist der richtige Ort für deine Frage. Ich habe 2 Dateien.
Die erste Datei hat 4 Felder: Klassen-CRN-Nr., Dozenten-ID-Nr., Klassenabschnitts-Nr., Anzahl der Studenten.
Beispiel:
0002 T00005 006 15
0004 T00004 012 26
.
.
etc
Die zweite Datei hat 6 Felder (soweit ich das beurteilen kann): Dozenten-ID-Nr., Vorname, Nachname, Gebäude, Vorwahl, Telefonnummer.
(nicht sicher, ob Vor-/Nachname ein oder zwei Felder sind …)
Beispiel:
T00001 Larry Lastname Corley 555 555-5555
T00002 Ron Lastname Coreley 555 111-1111
.
.
etc
Die Frage, die ich beantworten soll, lautet: Wie viele Kurse hat jeder Dozent in einem bestimmten Semester unterrichtet? Die Lösung muss folgende Form haben:
# of sections | Instructor ID # | FirstName | LastName
(Ich verwende das „|“ nur zur Veranschaulichung – die Lösung verwendet eigentlich nur Leerzeichen.)
Bisher habe ich Folgendes getan:
$ cat sections/sem092 | sort -k 2 | awk '{ print $2 }' | uniq -c
( sem092
ist die erste Datei, die ich erwähnt habe)
Und das Ergebnis warAlsokommt dem nahe, was ich brauche. Aus dem obigen Code habe ich Folgendes erhalten:
Num. of Sections Taught | Instructor ID #
Irgendwie muss ich über Pipes die ID-Nummer mit den Namen in der anderen Datei abgleichen. Ich habe das starke Gefühl, dass ich verwenden muss grep
. Ich suche niemanden, der mir „die Hand hält“. Ich finde das äußerst interessant, aber ich glaube, ich habe unterwegs etwas übersehen und brauche ein oder zwei Anstöße.
Antwort1
Speichern Sie die Ausgabe Ihres Befehls:
cat sections/sem092 | sort -k 2 | awk '{ print $2 }' | uniq -c > firstPart.txt
Speichern Sie diese Zeile in der Datei searchInstructorName.sh
:
cat $1 | while read line; do
instructorID=`echo $line | awk '{print $2}'`
name=`grep $instructorID instructorList | awk '{print $2 " " $4}'`
echo "$line $name"
done
Dieses Skript geht davon aus, dass die firtsPart.txt
Zeile wie folgt aussieht:
5 T00005
und das instructorList
ist der Name der Datei mit 6 Feldern.
Versuchen Sie abschließend:
bash searchInstructorName.sh firstPart.txt
es sollte funktionieren.
Dies ist die Version mit einem einzelnen Skript:
cat $1 | sort -k 2 | awk '{ print $2 }' | uniq -c | while read line; do
instructorID=`echo $line | awk '{print $2}'`
name=`grep $instructorID $2 | awk '{print $2 " " $4}'`
echo "$line $name"
done
Speichern Sie diese Zeilen searchInstructorInfo.sh
und führen Sie aus:
bash searchInstructorInfo.sh sections/sem092 instructorList
Antwort2
Vielen Dank für deine ausführlichen Antworten, Letizia. Ich habe Teile deines Codes verwendet und ein Teil davon wiederum hat mir weitere Ideen gegeben. Nur um diesen Beitrag nicht in der Schwebe zu lassen: Mein endgültiger (grauenhafter) Code sah so aus:
cat sections/sem092 | sort -k 2 | awk '{ print $2 }' | uniq -c > no3
paste instructors | awk '{ print $2 " " $3 }' > no3n
#guess I could have just used cat above
paste no3 no3n
Ich weiß, dieser Code ist beschämend – ich habe ihn heute meinem Professor gezeigt und er meinte: „Hmm … mal sehen. Was hast du hier gemacht?“ lol. Aber nachdem er ihn sich angeschaut hatte, meinte er, er sei in Ordnung. Er sagt immer: „Es gibt mehr als einen Weg, die sprichwörtliche Katze zu häuten.“
Vielen Dank an alle für die Hilfe, insbesondere an Letizia.