„Sort (Unix)“ – Versionsunterschied
[gesichtete Version] | [gesichtete Version] |
K Ignorierte Tags </pre> fixed und veraltete Tags <tt>→<code> |
|||
Zeile 1: | Zeile 1: | ||
{{SEITENTITEL:sort (Unix)}} |
{{SEITENTITEL:sort (Unix)}} |
||
'''sort''' (<code>/usr/bin/sort</code>) ist ein [[Unix]]-Werkzeug, mit dem [[Datenstrom|Datenströme]] oder Dateien sortiert, zusammengeführt oder auf eine bereits vorliegende Sortierung überprüft werden können. Sortierungsschlüssel können alphabetisch oder numerisch sein und konfigurierbare Teile der Eingabe(-zeilen) in ebenfalls konfigurierbarer Reihenfolge umfassen. |
|||
Der Funktionsumfang wie auch die Funktionsweise von < |
Der Funktionsumfang wie auch die Funktionsweise von <code>sort</code> ist durch den [[Portable Operating System Interface|POSIX]]-Standard geregelt<ref name="posix">{{Internetquelle |url=http://pubs.opengroup.org/onlinepubs/9699919799/utilities/sort.html |titel=sort-Spezifikation der Open Group |sprache=en |abruf=2013-05-02}}</ref>, allerdings weist das [[GNU]]-<code>sort</code> einige Abweichungen von diesem Standard auf. Auch die [[Single UNIX Specification]] listet das Utility <code>sort</code> als „mandatory“ (notwendigen Bestandteil) und spezifiziert sein erwartbares Verhalten.<ref>{{Internetquelle |url=http://www.unix.org/apis/cu.html |titel=UNIX® Commands & Utilities Interface Table |sprache=en |abruf=2013-05-03}}</ref> |
||
== Arbeitsweise == |
== Arbeitsweise == |
||
< |
<code>sort</code> arbeitet zeilenorientiert, Gegenstände der Sortierung sind sogenannte ''Records'' (entspricht Zeilen), die durch ''Newline''-Zeichen getrennt sind. Jeder solche ''Record'' besteht seinerseits aus ''Fields'', die durch ''Field Separators'' getrennt sind. Der Default für den ''Field Separator'' ist das ''blank'', es kann aber auch jedes andere Zeichen über die Kommandozeilen-Option <code>-t <char></code> gewählt werden. |
||
Sortierschlüssel werden definiert, indem ein Feld (oder auch ein Teil davon, etwa das dritte bis fünfte Zeichen eines bestimmten Feldes) und die dazugehörige Sortiermethode (alphabetisch oder numerisch) angegeben wird. Komplexe Sortierungsschlüssel können aus mehreren aufeinanderfolgenden solchen Einzelschlüsseln aufgebaut werden. Zum Beispiel kann nach einem Datumsfeld im Format „TT-MM-JJJJ“ sortiert werden, indem numerisch primär nach dem 7.–11. Zeichen, als Sekundärschlüssel nach dem 4.–5. Zeichen und als Tertiärschlüssel nach dem 1.–2. Zeichen sortiert wird (die Option < |
Sortierschlüssel werden definiert, indem ein Feld (oder auch ein Teil davon, etwa das dritte bis fünfte Zeichen eines bestimmten Feldes) und die dazugehörige Sortiermethode (alphabetisch oder numerisch) angegeben wird. Komplexe Sortierungsschlüssel können aus mehreren aufeinanderfolgenden solchen Einzelschlüsseln aufgebaut werden. Zum Beispiel kann nach einem Datumsfeld im Format „TT-MM-JJJJ“ sortiert werden, indem numerisch primär nach dem 7.–11. Zeichen, als Sekundärschlüssel nach dem 4.–5. Zeichen und als Tertiärschlüssel nach dem 1.–2. Zeichen sortiert wird (die Option <code>-n</code> am Anfang definiert alle nachfolgenden Schlüssel als numerisch): |
||
<pre> |
<pre> |
||
Zeile 13: | Zeile 13: | ||
</pre> |
</pre> |
||
Wird nichts anderes explizit angegeben, so gilt der nach der letzten Schlüsseldefinition anschließende Rest der Zeile als letzter Teilschlüssel (im Extremfall – wenn überhaupt kein Schlüssel definiert wird – bedeutet dies, dass < |
Wird nichts anderes explizit angegeben, so gilt der nach der letzten Schlüsseldefinition anschließende Rest der Zeile als letzter Teilschlüssel (im Extremfall – wenn überhaupt kein Schlüssel definiert wird – bedeutet dies, dass <code>sort</code> nach dem gesamten ''Record'' sortiert). Ist dies nicht gewünscht, so muss das Schlüsselende ausdrücklich angegeben werden: |
||
<pre> |
<pre> |
||
Zeile 20: | Zeile 20: | ||
</pre> |
</pre> |
||
Alphabetische Sortierungen werden von den Internationalisierungs-Einstellungen, insbesondere den Variablen '''< |
Alphabetische Sortierungen werden von den Internationalisierungs-Einstellungen, insbesondere den Variablen '''<code>LANG</code>''' bzw. '''<code>LC_ALL</code>''', '''<code>LC_COLLATE</code>''' usw. erheblich beeinflusst, auch numerische Sortierungen reagieren in ihrem Verhalten auf den jeweiligen Wert von '''<code>LC_NUMERIC</code>'''. |
||
{{Siehe auch|Alphabetische Sortierung}} |
{{Siehe auch|Alphabetische Sortierung}} |
||
=== Eingabe- und Ausgabeverhalten, Rückgabewerte === |
=== Eingabe- und Ausgabeverhalten, Rückgabewerte === |
||
< |
<code>sort</code> schreibt seine Ausgabe, sollte nichts anderes angegeben werden, nach <code>stdout</code> und Fehlermeldungen nach <code>stderr</code>. Diese Ausgaben können mit den üblichen Mitteln ([[Pipe (Informatik)|Pipeline]], [[Unix-Kommandos#Ein-/Ausgabeumlenkung (englisch I/O redirection)|Redirection]]) umgelenkt werden. Darüber hinaus steht der Switch <code>-o <file></code> zur Verfügung, der eine definierte Datei als Ziel der Standard-Ausgabe festlegt. |
||
< |
<code>sort</code> nimmt als Eingabe entweder einen Datenstrom auf <code>stdin</code> oder ein oder mehrere Dateien als Argument entgegen. Werden mehrere Dateien angegeben, so können diese im Zuge der Sortierung zu einer einzigen Ausgabedatei zusammengeführt werden. Der spezielle Dateiname <code>-</code> bedeutet <code>stdin</code>, sodass ein Datenstrom auch mit anderen Dateien zusammengeführt werden kann. |
||
Neben den üblichen Rückgabewerten 0 (Erfolg) und >1 (immanente Fehlerbedingung) kann, wenn die Sortierung einer Datei lediglich überprüft wird, auch der Wert 1 zurückgegeben werden. Dieser bedeutet, dass die angegebene Datei hinsichtlich des angegebenen Kriteriums nicht sortiert ist. |
Neben den üblichen Rückgabewerten 0 (Erfolg) und >1 (immanente Fehlerbedingung) kann, wenn die Sortierung einer Datei lediglich überprüft wird, auch der Wert 1 zurückgegeben werden. Dieser bedeutet, dass die angegebene Datei hinsichtlich des angegebenen Kriteriums nicht sortiert ist. |
||
Zeile 33: | Zeile 33: | ||
== Hinweise zur Verwendung == |
== Hinweise zur Verwendung == |
||
=== Veraltete Methoden der Schlüsseldefinition === |
=== Veraltete Methoden der Schlüsseldefinition === |
||
Das ursprüngliche < |
Das ursprüngliche <code>sort</code> kannte die heute übliche und standardisierte Form der Schlüsseldefinition über multiple <code>-k <Teilschlüssel></code>-Ausdrücke nicht. Stattdessen wurde der Schlüsselbeginn mit dem Switch <code>+N[.M]</code>, das Ende des jeweiligen Teilschlüssels mit <code>-N[.M]</code> angegeben, wobei <code>N</code> die (null-basierte) Nummer des Feldes, <code>M</code> die (ebenfalls null-basierte) Nummer des Zeichens innerhalb des Feldes darstellt. Das folgende Beispiel bietet dieselbe Schlüsseldefinition in alter und neuer Schreibweise. Es sortiert das User-Verzeichnis <code>/etc/passwd</code> numerisch (<code>-n</code>) nach dem 3. Feld (der User-ID), wobei „:“ als ''Field Separator'' dient (<code>-t':'</code>): |
||
< |
<pre> |
||
sort -t':' -n +2 -3 /etc/passwd |
sort -t':' -n +2 -3 /etc/passwd |
||
sort -t':' -n -k 3,3 /etc/passwd |
sort -t':' -n -k 3,3 /etc/passwd |
||
Zeile 51: | Zeile 51: | ||
: Folgende Modifikatoren stehen zur Verfügung: |
: Folgende Modifikatoren stehen zur Verfügung: |
||
:;< |
:;<code>b</code>: ''ignore leading blanks''; führende Leerzeichen werden ignoriert, was auch für Schlüssel gilt, die nicht mit dem ersten Zeichen des Feldes beginnen. Die Schlüsseldefinition <code>-k 2.2b,2</code> lässt den Sortierschlüssel etwa mit dem zweiten nicht-''Blank'' des zweiten Feldes beginnen und mit dem letzten Zeichen des zweiten Feldes enden. |
||
:;< |
:;<code>d</code>: ''dictionary''; Wörterbuchartige Sortierung. Dabei werden ausschließlich alphanumerische Zeichen und ''Blanks'' berücksichtigt, wobei der Wert von <code>LC_CTYPE</code> festlegt, was unter ''alphanumerisch'' verstanden wird. |
||
:;< |
:;<code>f</code>: ''fold lowercase to uppercase''; Schaltet die ''Case-Sensitivity'' (Unterscheidung von Groß- und Kleinbuchstaben) aus, indem Zeichen, die einen Großbuchstaben als Äquivalent haben, so sortiert werden, als wären sie durch jenen ersetzt. <code>LC_CTYPE</code> legt fest, welche Zeichenpaare dabei korrespondieren. |
||
:;< |
:;<code>i</code>: ''ignore unprintables''; ähnlich wie <code>d</code>, stattdessen werden alle nicht druckbaren Zeichen ignoriert. Auch hier legt <code>LC_CTYPE</code> fest, was unter „nicht druckbar“ verstanden wird. |
||
:;< |
:;<code>n</code>: ''numerical''; statt der alphanumerischen Sortierung wird numerisch sortiert. |
||
:;< |
:;<code>r</code>: ''reverse''; kehrt die Sortierreihenfolge um. Statt absteigend wird aufsteigend sortiert. |
||
=== Führende Leerzeichen === |
=== Führende Leerzeichen === |
||
Für Verwirrung sorgt regelmäßig die unterschiedliche Behandlung führender Leerzeichen, je nachdem, ob < |
Für Verwirrung sorgt regelmäßig die unterschiedliche Behandlung führender Leerzeichen, je nachdem, ob <code>-t</code> auf der Kommandozeile angegeben wird oder nicht. Insbesondere dann, wenn als ''Field Separator'' das ''Blank'' angegeben wird, was scheinbar den Default widerspiegelt. |
||
Wird < |
Wird <code>-t</code> nicht angegeben, so wird der führende ''Field Separator'' dem jeweiligen Feld zugeschlagen, deshalb werden führende ''Blanks'' dem ersten Feld zugerechnet, während sie ansonsten wie andere Zeichen behandelt werden und – im Falle von <code>-t' '</code> – als ''Field Separator'' fungieren. Hingegen wird bei Angabe von <code>-t</code> der ''Field Separator'' nicht als Teil des Felds betrachtet. Der POSIX-Standard führt in seinen erklärenden Hinweisen folgendes Beispiel an (''Blanks'' als <code><b></code> repräsentiert)<ref name="posix" />: |
||
<pre> |
<pre> |
Version vom 13. Mai 2019, 07:15 Uhr
sort (/usr/bin/sort
) ist ein Unix-Werkzeug, mit dem Datenströme oder Dateien sortiert, zusammengeführt oder auf eine bereits vorliegende Sortierung überprüft werden können. Sortierungsschlüssel können alphabetisch oder numerisch sein und konfigurierbare Teile der Eingabe(-zeilen) in ebenfalls konfigurierbarer Reihenfolge umfassen.
Der Funktionsumfang wie auch die Funktionsweise von sort
ist durch den POSIX-Standard geregelt[1], allerdings weist das GNU-sort
einige Abweichungen von diesem Standard auf. Auch die Single UNIX Specification listet das Utility sort
als „mandatory“ (notwendigen Bestandteil) und spezifiziert sein erwartbares Verhalten.[2]
Arbeitsweise
sort
arbeitet zeilenorientiert, Gegenstände der Sortierung sind sogenannte Records (entspricht Zeilen), die durch Newline-Zeichen getrennt sind. Jeder solche Record besteht seinerseits aus Fields, die durch Field Separators getrennt sind. Der Default für den Field Separator ist das blank, es kann aber auch jedes andere Zeichen über die Kommandozeilen-Option -t <char>
gewählt werden.
Sortierschlüssel werden definiert, indem ein Feld (oder auch ein Teil davon, etwa das dritte bis fünfte Zeichen eines bestimmten Feldes) und die dazugehörige Sortiermethode (alphabetisch oder numerisch) angegeben wird. Komplexe Sortierungsschlüssel können aus mehreren aufeinanderfolgenden solchen Einzelschlüsseln aufgebaut werden. Zum Beispiel kann nach einem Datumsfeld im Format „TT-MM-JJJJ“ sortiert werden, indem numerisch primär nach dem 7.–11. Zeichen, als Sekundärschlüssel nach dem 4.–5. Zeichen und als Tertiärschlüssel nach dem 1.–2. Zeichen sortiert wird (die Option -n
am Anfang definiert alle nachfolgenden Schlüssel als numerisch):
sort -n -k 1.7,1.11 -k 1.4,1.5 -k 1.1,1.2 /path/to/input
Wird nichts anderes explizit angegeben, so gilt der nach der letzten Schlüsseldefinition anschließende Rest der Zeile als letzter Teilschlüssel (im Extremfall – wenn überhaupt kein Schlüssel definiert wird – bedeutet dies, dass sort
nach dem gesamten Record sortiert). Ist dies nicht gewünscht, so muss das Schlüsselende ausdrücklich angegeben werden:
sort -k 2 /path/to/input # sortiert nach Feld 2 bis Zeilenende sort -k 2,2 /path/to/input # sortiert ausschließlich nach Feld 2
Alphabetische Sortierungen werden von den Internationalisierungs-Einstellungen, insbesondere den Variablen LANG
bzw. LC_ALL
, LC_COLLATE
usw. erheblich beeinflusst, auch numerische Sortierungen reagieren in ihrem Verhalten auf den jeweiligen Wert von LC_NUMERIC
.
Eingabe- und Ausgabeverhalten, Rückgabewerte
sort
schreibt seine Ausgabe, sollte nichts anderes angegeben werden, nach stdout
und Fehlermeldungen nach stderr
. Diese Ausgaben können mit den üblichen Mitteln (Pipeline, Redirection) umgelenkt werden. Darüber hinaus steht der Switch -o <file>
zur Verfügung, der eine definierte Datei als Ziel der Standard-Ausgabe festlegt.
sort
nimmt als Eingabe entweder einen Datenstrom auf stdin
oder ein oder mehrere Dateien als Argument entgegen. Werden mehrere Dateien angegeben, so können diese im Zuge der Sortierung zu einer einzigen Ausgabedatei zusammengeführt werden. Der spezielle Dateiname -
bedeutet stdin
, sodass ein Datenstrom auch mit anderen Dateien zusammengeführt werden kann.
Neben den üblichen Rückgabewerten 0 (Erfolg) und >1 (immanente Fehlerbedingung) kann, wenn die Sortierung einer Datei lediglich überprüft wird, auch der Wert 1 zurückgegeben werden. Dieser bedeutet, dass die angegebene Datei hinsichtlich des angegebenen Kriteriums nicht sortiert ist.
Hinweise zur Verwendung
Veraltete Methoden der Schlüsseldefinition
Das ursprüngliche sort
kannte die heute übliche und standardisierte Form der Schlüsseldefinition über multiple -k <Teilschlüssel>
-Ausdrücke nicht. Stattdessen wurde der Schlüsselbeginn mit dem Switch +N[.M]
, das Ende des jeweiligen Teilschlüssels mit -N[.M]
angegeben, wobei N
die (null-basierte) Nummer des Feldes, M
die (ebenfalls null-basierte) Nummer des Zeichens innerhalb des Feldes darstellt. Das folgende Beispiel bietet dieselbe Schlüsseldefinition in alter und neuer Schreibweise. Es sortiert das User-Verzeichnis /etc/passwd
numerisch (-n
) nach dem 3. Feld (der User-ID), wobei „:“ als Field Separator dient (-t':'
):
sort -t':' -n +2 -3 /etc/passwd sort -t':' -n -k 3,3 /etc/passwd
Diese Methode ist in bestehenden Scripten noch sehr häufig zu sehen, dennoch wird von ihrem Gebrauch mittlerweile abgeraten. Auch wenn die meisten heutigen Implementierungen diese Schreibweise noch verstehen, so ist sie dennoch nicht mehr Bestandteil des POSIX-Standards und portable Scripte sollten sie deshalb nicht voraussetzen.
Einflüsse auf die Sortierreihenfolge
Neben der grundsätzlichen Unterscheidung in alphanumerische und numerische Sortierung und den bereits erwähnten Internationalisierungs-Variablen stehen dem Benutzer noch eine Reihe weiterer Möglichkeiten zur Verfügung, die Sortierreihenfolge zu beeinflussen. Dies kann jeweils für die gesamte Sortierung global über eine Option oder nur für einen Teilschlüssel durch einen nachgestellten Modifikator geschehen. Option und Modifikator lauten dabei jeweils gleich.
sort -n -k 3,3 -k 4,4 /path/to/input # -n gilt global für beide Schlüssel sort -k 3,3n -k 4,4 /path/to/input # -n gilt lediglich für den ersten Teilschlüssel
- Folgende Modifikatoren stehen zur Verfügung:
b
- ignore leading blanks; führende Leerzeichen werden ignoriert, was auch für Schlüssel gilt, die nicht mit dem ersten Zeichen des Feldes beginnen. Die Schlüsseldefinition
-k 2.2b,2
lässt den Sortierschlüssel etwa mit dem zweiten nicht-Blank des zweiten Feldes beginnen und mit dem letzten Zeichen des zweiten Feldes enden. d
- dictionary; Wörterbuchartige Sortierung. Dabei werden ausschließlich alphanumerische Zeichen und Blanks berücksichtigt, wobei der Wert von
LC_CTYPE
festlegt, was unter alphanumerisch verstanden wird. f
- fold lowercase to uppercase; Schaltet die Case-Sensitivity (Unterscheidung von Groß- und Kleinbuchstaben) aus, indem Zeichen, die einen Großbuchstaben als Äquivalent haben, so sortiert werden, als wären sie durch jenen ersetzt.
LC_CTYPE
legt fest, welche Zeichenpaare dabei korrespondieren. i
- ignore unprintables; ähnlich wie
d
, stattdessen werden alle nicht druckbaren Zeichen ignoriert. Auch hier legtLC_CTYPE
fest, was unter „nicht druckbar“ verstanden wird. n
- numerical; statt der alphanumerischen Sortierung wird numerisch sortiert.
r
- reverse; kehrt die Sortierreihenfolge um. Statt absteigend wird aufsteigend sortiert.
Führende Leerzeichen
Für Verwirrung sorgt regelmäßig die unterschiedliche Behandlung führender Leerzeichen, je nachdem, ob -t
auf der Kommandozeile angegeben wird oder nicht. Insbesondere dann, wenn als Field Separator das Blank angegeben wird, was scheinbar den Default widerspiegelt.
Wird -t
nicht angegeben, so wird der führende Field Separator dem jeweiligen Feld zugeschlagen, deshalb werden führende Blanks dem ersten Feld zugerechnet, während sie ansonsten wie andere Zeichen behandelt werden und – im Falle von -t' '
– als Field Separator fungieren. Hingegen wird bei Angabe von -t
der Field Separator nicht als Teil des Felds betrachtet. Der POSIX-Standard führt in seinen erklärenden Hinweisen folgendes Beispiel an (Blanks als <b>
repräsentiert)[1]:
sort <<EOF <b><b>foo EOF # erstes Feld: "<b><b>foo", zweites Feld leer, drittes Feld leer sort -t'<b>' <<EOF <b><b>foo EOF # erstes Feld leer, zweites Feld leer, drittes Feld "foo"
Einzelnachweise
- ↑ a b sort-Spezifikation der Open Group. Abgerufen am 2. Mai 2013 (englisch).
- ↑ UNIX® Commands & Utilities Interface Table. Abgerufen am 3. Mai 2013 (englisch).