for f in 20*.txt
do
sed -n '1p' "$f" | cut -d' ' -f3 >> displayStudentInfo.txt
head -3 "$f" | tail -2 >> displayStudentInfo.txt
done
cat displayStudentInfo.txt
rm displayStudentInfo.txt
printf "\n"
Wenn ich diesen Code verwende, bekomme ich die Hälfte des Dateiinhalts angezeigt, aber wenn ich es versuche, cat
kann ich das gesamte Ergebnis sehen. Und wie kann ich alle Dateien in einer Zeile auflisten, anstatt nur die ersten drei Zeilen zu verwenden?
Zum Beispiel:
ID
Name
Grade
Ich möchte stattdessen alles in einer Reihe darstellen:
ID Name Grade
Wenn ich diesen Code verwende, head displayStudentInfo.txt
erhalte ich die Hälfte des Dateiinhalts:
201700128
GPA: 3.2
Major: Pharmacy
201703451
GPA: 2.2
Major: Political Science
201759284
GPA: 3.4
Major: Marketing
201800082
es sollen 9 verschiedene Studenten sein und ich weiß nicht, wie ich ID, Hauptfach und GPA in eine Zeile bringen soll.
Antwort1
Sie haben Ihre Aufgabe gelöst, aber eine Frage offen gelassen, die niemand ohne die erforderlichen Informationen beantworten kann. Diese Site dient als Archiv für andere, die nach einer Antwort auf ihre Probleme suchen. Daher ist es ärgerlich, Fragen wie diese offen zu lassen.
Ich nutze die Gelegenheit, um die Schwächen Ihres Versuchs aufzuzeigen. Beispielsweise mischen Sie Tools ohne Vorteil:
sed -n '1p' "$f" | cut -d' ' -f3 >> displayStudentInfo.txt
head -3 "$f" | tail -2 >> displayStudentInfo.txt
Die erste Zeile zeigt, dass Sie wissen, wie Sie sed
bestimmte Zeilen erhalten. Warum verwenden Sie also diese umständliche und schwer lesbare Kombination aus head
und tail
in der zweiten Zeile? sed -n '2p;3p'
Würde offensichtlich dasselbe bewirken. Oder Sie könnten schreiben, sed '2,3!d'
dass alle Likes außer dem Bereich von Zeile 2 bis 3 gelöscht werden sollen.
Natürlich sed
kann man auch das dritte Feld der ersten Zeile wie folgt extrahieren sed -E '1!d;s/([^ ]* ){2}//;s/ .*//'
(die ersten beiden Felder und dann alles hinter dem ersten Feld entfernen), was an dieser Stelle zwar keine Vereinfachung darstellt, es aber einfacher macht, wenn man alle drei Teile zu einer Zeile zusammenfassen und dabei sogar die Schleife loswerden möchte for
:
sed -sE '1!d;s/([^ ]* ){2}//;s/ .*//;N;N;s/\n/\t/g' 20*.txt
(GNU sed
-Syntax mit der Option, -s
Dateien separat zu behandeln und \t
in der Ausgabe einen Tabulator als Feldtrennzeichen zu verwenden). Sie müssen nicht durch verschiedene Tools weiterleiten und temporäre Dateien haben. Extrahieren Sie einfach das dritte Feld, hängen Sie zwei weitere Zeilen an und ersetzen Sie die Zeilenumbrüche durch Tabulatoren.