Ich erhalte eine Ausgabe von einem Programm, das zuerst eine Zeile mit einer Reihe von Spaltenüberschriften und dann eine Reihe von Datenzeilen erstellt. Ich möchte verschiedene Spalten dieser Ausgabe ausschneiden und sie nach verschiedenen Spalten sortiert anzeigen. Ohne die Überschriften kann das Ausschneiden und Sortieren auf einfache Weise über die -k
Option ausgeführt werden, eine Teilmenge der Spalten sort
zusammen mit cut
oder awk
anzuzeigen. Bei dieser Sortiermethode werden die Spaltenüberschriften jedoch mit den übrigen Ausgabezeilen gemischt. Gibt es eine einfache Möglichkeit, die Überschriften oben zu belassen?
text-processing
sort
table
jonderry
quelle
quelle
{ head -1; sort; }
zum Laufen bringen. Es wird immer ein Teil des Texts nach der ersten Zeile gelöscht. Weiß jemand, warum das passiert?head
liegt daran, dass mehr als eine Zeile in einen Puffer eingelesen und das meiste davon weggeworfen wird. Meinesed
Idee hatte das gleiche Problem.lseek
fähigen Eingaben, so dass sie beim Lesen aus einer Pipe nicht funktioniert. Es wird funktionieren, wenn Sie zu einer Datei umleiten>outfile
und dann ausführen{ head -n 1; sort; } <outfile
Antworten:
Die Idee von Andy stehlen und es zu einer Funktion machen, damit es einfacher zu bedienen ist:
Jetzt kann ich tun:
quelle
ps -C COMMAND
ist vielleicht angemessener alsgrep COMMAND
, aber es ist nur ein Beispiel. Sie können auch nicht verwenden,-C
wenn Sie auch eine andere Auswahloption verwendet haben, z-U
.body
? Wie inbody sort
oderbody grep
. Gedanken?header
inbody
, weil Sie die Aktion am Körper ausführen. Hoffentlich macht das mehr Sinn.body
alle nachfolgenden Teilnehmer der Pipeline anzurufen :ps -o pid,comm | body grep less | body sort -k1nr
<foo body sort -k2
oderbody sort -k2 <foo
. Nur eine zusätzliche Figur von dem, was Sie wollten.Sie können den Header mit bash wie folgt oben belassen:
Oder mach es mit Perl:
quelle
{}
statt()
?IFS=
Deaktiviert die Wortteilung beim Lesen der Eingabe. Ich denke nicht, dass es beim Lesen notwendig ist$REPLY
.echo
erweitert Backslash-Escape, wennxpg_echo
gesetzt (nicht die Standardeinstellung);printf
ist in diesem Fall sicherer.echo $REPLY
Ohne Anführungszeichen werden Leerzeichen kondensiert. Ich denke,echo "$REPLY"
sollte in Ordnung sein.read -r
wird benötigt, wenn die Eingabe Backslash-Escape-Zeichen enthalten kann. Einige davon hängen möglicherweise von der Bash-Version ab.read REPLY; echo $REPLY
(Leerzeichen entfernen ) undread; echo $REPLY
(nicht).xpg_echo
hängt von Ihrem System ab, z. B. von Solaris. Ich denke , der Standardwert ist true. Deshalb mag Gillesprintf
so gern: Es ist das einzige, was vorhersehbares Verhalten aufweist.Ich habe eine nette awk-Version gefunden , die gut in Skripten funktioniert:
quelle
sort
Befehl extern auf? Kennt jemand mindestens einen Link zu einer Seite, die die Verwendung von Pipes in awk erklärt?Hackisch, aber effektiv: Vor dem Sortieren
0
allen Kopfzeilen und1
allen anderen Zeilen voranstellen . Entfernen Sie das erste Zeichen nach dem Sortieren.quelle
Hier sind einige magische Perl-Zeilenrauschen, durch die Sie Ihre Ausgabe leiten können, um alles zu sortieren, aber die erste Zeile ganz oben zu belassen:
perl -e 'print scalar <>, sort <>;'
quelle
Ich habe die
command | {head -1; sort; }
Lösung ausprobiert und kann bestätigen, dass sie wirklich alles vermasselt -head
liest mehrere Zeilen aus der Pipe ein und gibt dann nur die erste aus. Der Rest der Ausgabe, derhead
nicht gelesen wurde, wird alsosort
ab Zeile 2 an --NOT den Rest der Ausgabe übergeben!Das Ergebnis ist, dass Sie Zeilen (und eine Teilzeile!) Am Anfang Ihrer Befehlsausgabe vermissen (außer Sie haben noch die erste Zeile) - eine Tatsache, die leicht durch Hinzufügen einer Pipe
wc
am Ende von bestätigt werden kann die obige Pipeline - aber das ist außerordentlich schwer zu finden, wenn Sie das nicht wissen! Ich habe mindestens 20 Minuten damit verbracht, herauszufinden, warum ich eine Teilzeile (die ersten 100 Bytes oder so abgeschnitten) in meiner Ausgabe hatte, bevor ich sie löste.Am Ende tat ich Folgendes, was wunderbar funktionierte und keine zweimalige Ausführung des Befehls erforderte:
Wenn Sie die Ausgabe in eine Datei einfügen müssen, können Sie dies folgendermaßen ändern:
quelle
head
eingebaute ksh93 oder dasline
Dienstprogramm (auf Systemen, auf denen noch eines vorhanden ist) odergnu-sed -u q
oder verwendenIFS=read -r line; printf '%s\n' "$line"
, das die Eingabe byteweise liest, um dies zu vermeiden.Ich denke, das ist am einfachsten.
oder das, was möglicherweise schneller ist, da es keine Sub-Shell erzeugt
Andere coole Verwendungen
Zeilen nach der Kopfzeile mischen
Zeilen nach Kopfzeile umkehren
quelle
cat file | { head -n 1 ; sort ; } > file2
nur Showkopfquelle
command
zweimal. Daher ist es auf bestimmte Befehle beschränkt. Für den angefordertenps
Befehl im Beispiel würde dies jedoch funktionieren.Einfach und unkompliziert!
quelle
command
zweimal. Für den Einsatz in einer Pipeline also nicht wirklich geeignet.Ich kam hierher und suchte nach einer Lösung für den Befehl
w
. Dieser Befehl zeigt Details darüber an, wer angemeldet ist und was sie tun.Um die Ergebnisse sortiert anzuzeigen, aber mit den Kopfzeilen oben (es gibt 2 Kopfzeilenzeilen), habe ich Folgendes festgelegt:
Offensichtlich wird der Befehl
w
zweimal ausgeführt und ist daher möglicherweise nicht für alle Situationen geeignet. Zu seinem Vorteil ist es jedoch wesentlich leichter zu merken.Beachten Sie, dass die
tail -n +3
Mittel 'alle Zeilen ab dem 3. anzeigen' (sieheman tail
für Details).quelle
Versuchen Sie Folgendes:
quelle