So beheben Sie das Problem mit halben Ausgabeergebnissen

So beheben Sie das Problem mit halben Ausgabeergebnissen
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, catkann 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 sedbestimmte Zeilen erhalten. Warum verwenden Sie also diese umständliche und schwer lesbare Kombination aus headund tailin 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 sedkann 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, -sDateien separat zu behandeln und \tin 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.

verwandte Informationen