sort (Unix)

From Wikipedia, the free encyclopedia

Template:Short description

Script error: No such module "Infobox". Script error: No such module "Check for unknown parameters".Script error: No such module "Check for conflicting parameters". In computing, sort is a standard command line program of Unix and Unix-like operating systems, that prints the lines of its input or concatenation of all files listed in its argument list in sorted order. Sorting is done based on one or more sort keys extracted from each line of input. By default, the entire input is taken as sort key. Blank space is the default field separator. The command supports a number of command-line options that can vary by implementation. For instance the "-r" flag will reverse the sort order. Sort ordering is affected by the environment's locale settings.[1]

History

A sort command that invokes a general sort facility was first implemented within Multics.[2] Later, it appeared in Version 1 Unix. This version was originally written by Ken Thompson at AT&T Bell Laboratories. By Version 4 Thompson had modified it to use pipes, but sort retained an option to name the output file because it was used to sort a file in place. In Version 5, Thompson invented "-" to represent standard input.[3]

sort is part of X/Open Portability Guide Issue 2 (1987). From there it was inherited into POSIX.[4]

The version of Page Template:Mono/styles.css has no content.sort bundled in GNU coreutils was written by Mike Haertel and Paul Eggert.[1] This implementation employs the mergesort algorithm. It offers an option to sort in parallel, though performance gain diminishes after 8 threads.[5] GNU parallel also provides a wrapper to perform parallel invocations of Page Template:Mono/styles.css has no content.sort with similar performance-gain characteristics: on a 48-core system, the speedup is about 3×.[6]

The Page Template:Mono/styles.css has no content.sort command has also been ported to the IBM i operating system, being accessible from the POSIX-compatible Qshell.[7]

Non-POSIX ports

Similar commands are available on many other operating systems, for example a Page Template:Mono/styles.css has no content.sort command is part of ASCII's MSX-DOS2 Tools for MSX-DOS version 2.[8]

The "uutils" project provides a cross-platform implementation of sort written in Rust, with support for all of GNU coreutil's options. It uses the par_sort_by or par_sort_unstable_by function of Rayon, the Rust multi-threading library, implementing either an adaptive mergesort inspired by timsort or a variation of pattern-defeating quicksort.[9]

Syntax

sort [OPTION]... [FILE]...

With no FILE, or when FILE is -, the command reads from standard input.

Parameters

In the table below, "Short" indicates only support for the one-letter (short) form of the option. Long options are originally a GNU extension and is not part of any version of SUS or POSIX. It has since also been adopted by FreeBSD.

Name Description SUS/POSIX Plan 9 Inferno FreeBSD Linux MSX-DOS IBM i
Template:Tt,
Template:Tt
roIgnores leading blanks. Template:Maybe Template:Maybe No Yes Yes No Template:Maybe
Template:Tt,
Template:Tt
Check that input file is sorted. No Template:Maybe No Yes Yes No Template:Maybe
Template:Tt,
Template:Tt
Like -c, but does not report the first bad line. No No No Yes Yes No No
Template:Tt,
Template:Tt
Considers only blanks and alphanumeric characters. Template:Maybe Template:Maybe No Yes Yes No Template:Maybe
Template:Tt,
Template:Tt
Fold lower case to upper case characters. Template:Maybe Template:Maybe No Yes Yes No Template:Maybe
Template:Tt,
Template:Tt,
Template:Tt
Compares according to general numerical value. Template:Maybe Template:Maybe No Yes Yes No No
Template:Tt,
Template:Tt,
Template:Tt
Compare human readable numbers (e.g., 2K 1G). Template:Maybe No No Yes Yes No No
Template:Tt,
Template:Tt
Considers only printable characters. Template:Maybe Template:Maybe No Yes Yes No Template:Maybe
Template:Tt,
Template:TtPOS1Template:TtPOS2Template:Tt
Start a key at POS1 (origin 1), end it at POS2 (default end of line) No No No Yes Yes No No
Template:Tt Merge only; input files are assumed to be presorted. No Template:Maybe No Yes Yes No Template:Maybe
Template:Tt,
Template:Tt,
Template:Tt
Compares (unknown) < 'JAN' < ... < 'DEC'. Template:Maybe Template:Maybe No Yes Yes No No
Template:Tt,
Template:Tt,
Template:Tt
Compares according to string numerical value. Template:Maybe Template:Maybe Template:Maybe Yes Yes No Template:Maybe
Template:Tt OUTPUT Uses OUTPUT file instead of standard output. No Template:Maybe No Yes Yes No Template:Maybe
Template:Tt,
Template:Tt
Reverses the result of comparisons. Template:Maybe Template:Maybe Template:Maybe Yes Yes No Template:Maybe
Template:Tt,
Template:Tt,
Template:Tt
Shuffles, but groups identical keys. See also: shuf No No No Yes Yes No No
Template:Tt Stabilizes sort by disabling last-resort comparison. No No No Yes Yes No No
Template:Tt size,
Template:Ttsize
Use size for the maximum size of the memory buffer. No No No Yes No No No
Template:Tt char,
Template:Ttchar
Uses char instead of non-blank to blank transition. In other words, 'Tab character' separating fields is char. No Template:Maybe No Yes Yes No Template:Maybe
Template:Tt dir,
Template:Ttdir
Uses dir for temporaries. No Template:Maybe No Yes Yes No No
Template:Tt,
Template:Tt
Unique processing to suppress all but one in each set of lines having equal keys. No Template:Maybe No Yes Yes No Template:Maybe
Template:Tt,
Template:Tt
Natural sort of (version) numbers within text No No No Yes Yes No No
Template:Tt Like -i, but ignore only tabs and spaces. No Yes No No No No No
Template:Tt,
Template:Tt
End lines with 0 byte, not newline No No No Yes Yes No No
Template:Tt Display help and exit No No No Yes Yes No No
Template:Tt Output version information and exit No No No Yes Yes No No
Template:Tt Reverses the result of comparisons. No No No No No Yes No
Template:Tt Specify the number of digits to determine how many digits of each line should be judged. No No No No No Yes No
Template:Tt Sort by ASCII code. No No No No No Yes No
Template:Tt Include hidden files when using wild cards. No No No No No Yes No

Examples

Sort a file in alphabetical order

$ cat phonebook
Smith, Brett     555-4321
Doe, John        555-1234
Doe, Jane        555-3214
Avery, Cory      555-4132
Fogarty, Suzie   555-2314
$ sort phonebook
Avery, Cory      555-4132
Doe, Jane        555-3214
Doe, John        555-1234
Fogarty, Suzie   555-2314
Smith, Brett     555-4321

Sort by number

The -n option makes the program sort according to numerical value. The Page Template:Mono/styles.css has no content.du command produces output that starts with a number, the file size, so its output can be piped to Page Template:Mono/styles.css has no content.sort to produce a list of files sorted by (ascending) file size:

$ du /bin/* | sort -n
4       /bin/domainname
24      /bin/ls
102     /bin/sh
304     /bin/csh

The Page Template:Mono/styles.css has no content.find command with the Page Template:Mono/styles.css has no content.ls option prints file sizes in the 7th field, so a list of the Page Template:Mono/styles.css has no content.LaTeX files sorted by file size is produced by:

$ find . -name "*.tex" -ls | sort -k 7n

Columns or fields

Use the -k option to sort on a certain column. For example, use "-k 2" to sort on the second column. In old versions of sort, the +1 option made the program sort on the second column of data (+2 for the third, etc.). This usage is deprecated.

$ cat zipcode
Adam  12345
Bob   34567
Joe   56789
Sam   45678
Wendy 23456
$ sort -k 2n zipcode
Adam  12345
Wendy 23456
Bob   34567
Sam   45678
Joe   56789

Sort on multiple fields

The -k m,n option lets you sort on a key that is potentially composed of multiple fields (start at column m, end at column n):

$ cat quota
fred 2000
bob 1000
an 1000
chad 1000
don 1500
eric 500
$ sort -k2,2n -k1,1 quota
eric 500
an 1000
bob 1000
chad 1000
don 1500
fred 2000

Here the first sort is done using column 2. -k2,2n specifies sorting on the key starting and ending with column 2, and sorting numerically. If -k2 is used instead, the sort key would begin at column 2 and extend to the end of the line, spanning all the fields in between. -k1,1 dictates breaking ties using the value in column 1, sorting alphabetically by default. Note that bob, and chad have the same quota and are sorted alphabetically in the final output.

Sorting a pipe delimited file

$ sort -k2,2,-k1,1 -t'|' zipcode
Adam|12345
Wendy|23456
Sam|45678
Joe|56789
Bob|34567

Sorting a tab delimited file

Sorting a file with tab separated values requires a tab character to be specified as the column delimiter. This illustration uses the shell's dollar-quote notation[10][11] to specify the tab as a C escape sequence.

$ sort -k2,2 -t $'\t' phonebook 
Doe, John	555-1234
Fogarty, Suzie	555-2314
Doe, Jane	555-3214
Avery, Cory	555-4132
Smith, Brett	555-4321

Sort in reverse

The -r option just reverses the order of the sort:

$ sort -rk 2n zipcode
Joe   56789
Sam   45678
Bob   34567
Wendy 23456
Adam  12345

Sort in random

The GNU implementation has a -R --random-sort option based on hashing; this is not a full random shuffle because it will sort identical lines together. A true random sort is provided by the Unix utility shuf.

Sort by version

The GNU implementation has a -V --version-sort option which is a natural sort of (version) numbers within text. Two text strings that are to be compared are split into blocks of letters and blocks of digits. Blocks of letters are compared alpha-numerically, and blocks of digits are compared numerically (i.e., skipping leading zeros, more digits means larger, otherwise the leftmost digits that differ determine the result). Blocks are compared left-to-right and the first non-equal block in that loop decides which text is larger. This happens to work for IP addresses, Debian package version strings and similar tasks where numbers of variable length are embedded in strings.

See also

References

Page Template:Reflist/styles.css has no content.

  1. a b Template:Man
  2. Script error: No such module "citation/CS1".
  3. Script error: No such module "citation/CS1".
  4. Template:Man
  5. Script error: No such module "citation/CS1".
  6. Script error: No such module "citation/CS1".
  7. Script error: No such module "citation/CS1".
  8. Script error: No such module "citation/CS1".
  9. Script error: No such module "citation/CS1".
  10. Script error: No such module "citation/CS1".
  11. Script error: No such module "citation/CS1".

Script error: No such module "Check for unknown parameters".

Further reading

  • Script error: No such module "citation/CS1".
  • Script error: No such module "citation/CS1".

Script error: No such module "Side box".

Script error: No such module "Navbox". Template:Plan 9 commands Template:Core Utilities commands