---
title: Sort lines
source: https://vim.fandom.com/wiki/Sort_lines
---
## [Sort lines in Vim](https://vim.fandom.com/wiki/Sort_lines)
Vim has a very powerful built-in sort utility, or it can interface with an external one. In order to ***keep only unique lines*** in Vim, you would:
:{range}sort u
Yes, it's that simple.
You could create a range in advance, such as `'a,.` (from mark 'a' to the current line) or you could create one on-the-fly using visual selection by pressing ':' in visual mode, after selecting the text you wish to sort, to get a range of `'<,'>` on the command line.
If you like using an external sort utility instead, you can do it just as easily. For example, Unix sort, removing duplicate lines:
:{range}!sort -u
Many other systems also have an external sort utility, but the options and capabilities will differ. It is probably better to use the built-in Vim sort unless you are looking for a specific feature of the external sort (or using an old Vim without the `:sort` command).
## Examples\[[edit](https://vim.fandom.com/wiki/Sort_lines?veaction=edit§ion=1 "Edit section: Examples") | [edit source](https://vim.fandom.com/wiki/Sort_lines?section=1&veaction=editsource "Edit section: Examples")\]
### Sort in reverse\[[edit](https://vim.fandom.com/wiki/Sort_lines?veaction=edit§ion=2 "Edit section: Sort in reverse") | [edit source](https://vim.fandom.com/wiki/Sort_lines?section=2&veaction=editsource "Edit section: Sort in reverse")\]
:%sort!
### Sort, removing duplicate lines\[[edit](https://vim.fandom.com/wiki/Sort_lines?veaction=edit§ion=3 "Edit section: Sort, removing duplicate lines") | [edit source](https://vim.fandom.com/wiki/Sort_lines?section=3&veaction=editsource "Edit section: Sort, removing duplicate lines")\]
:%sort u
### Sort using the external Unix sort utility, respecting month-name order\[[edit](https://vim.fandom.com/wiki/Sort_lines?veaction=edit§ion=4 "Edit section: Sort using the external Unix sort utility, respecting month-name order") | [edit source](https://vim.fandom.com/wiki/Sort_lines?section=4&veaction=editsource "Edit section: Sort using the external Unix sort utility, respecting month-name order")\]
:%!sort -M
("respecting month-name order" means January < February < ... < December)
### Numeric sort\[[edit](https://vim.fandom.com/wiki/Sort_lines?veaction=edit§ion=5 "Edit section: Numeric sort") | [edit source](https://vim.fandom.com/wiki/Sort_lines?section=5&veaction=editsource "Edit section: Numeric sort")\]
:sort n
(this way, 100 doesn't precede 20 in the sort)
### Sort subsections independently, in this example sort numbers between "start" and "end" markers\[[edit](https://vim.fandom.com/wiki/Sort_lines?veaction=edit§ion=6 "Edit section: Sort subsections independently, in this example sort numbers between "start" and "end" markers") | [edit source](https://vim.fandom.com/wiki/Sort_lines?section=6&veaction=editsource "Edit section: Sort subsections independently, in this example sort numbers between "start" and "end" markers")\]
:g/start/+1,/end/-1 sort n
### Sort only specific lines using ranges\[[edit](https://vim.fandom.com/wiki/Sort_lines?veaction=edit§ion=7 "Edit section: Sort only specific lines using ranges") | [edit source](https://vim.fandom.com/wiki/Sort_lines?section=7&veaction=editsource "Edit section: Sort only specific lines using ranges")\]
sort lines 296 to 349, inclusive
:296,349sort
### Sort by pattern\[[edit](https://vim.fandom.com/wiki/Sort_lines?veaction=edit§ion=8 "Edit section: Sort by pattern") | [edit source](https://vim.fandom.com/wiki/Sort_lines?section=8&veaction=editsource "Edit section: Sort by pattern")\]
When working with Javascript ES6, it may be useful to sort your imports
import './ProjectTemplateEditModal.scss';
import * as _ from "lodash";
import Moment from 'moment';
import React from 'react';
import { Button, Col, Modal, Row, Label } from 'react-bootstrap';
import { CurrencyControl } from '../../Core/Components/Controls';
import { DynamicModalMixin } from '../../Core/Components/Modals';
import { ProjectTemplateStore } from '../Stores/ProjectTemplateStore';
import { StoreBinder } from '../../Core/Utils/StoreBinder';
import { TextAreaControl } from '../../Core/Components/Controls/TextAreaControl';
import { TextBoxControl } from '../../Core/Components/Controls/TextBoxControl';
import { TooltipWrapper } from '../../Core/Components/Tooltips/TooltipWrapper';
import { withRouter } from 'react-router';
It is possible to pass a regex expression to sort. Any lines that do not match the expression will be sorted normally, while lines that do match will be sorted on the text that \*follows\* the expression.
:{range}sort /\\/\[A-z\]/
This will organize your imports relative to the "package" they are related to:
import * as _ from "lodash";
import Moment from 'moment';
import React from 'react';
import { Button, Col, Modal, Row, Label } from 'react-bootstrap';
import { withRouter } from 'react-router';
import { CurrencyControl } from '../../Core/Components/Controls';
import { TextAreaControl } from '../../Core/Components/Controls/TextAreaControl';
import { TextBoxControl } from '../../Core/Components/Controls/TextBoxControl';
import { DynamicModalMixin } from '../../Core/Components/Modals';
import { TooltipWrapper } from '../../Core/Components/Tooltips/TooltipWrapper';
import { StoreBinder } from '../../Core/Utils/StoreBinder';
import './ProjectTemplateEditModal.scss';
import { ProjectTemplateStore } from '../Stores/ProjectTemplateStore';
You can also sort on text that \*matches\* the regex by including the 'r' flag, for example:
:{range}sort /\\/\[A-z\]/ r
## See also\[[edit](https://vim.fandom.com/wiki/Sort_lines?veaction=edit§ion=9 "Edit section: See also") | [edit source](https://vim.fandom.com/wiki/Sort_lines?section=9&veaction=editsource "Edit section: See also")\]
- [374 Use filter commands to process text](https://vim.fandom.com/wiki/VimTip374 "VimTip374")
- [588 How to sort using visual blocks](https://vim.fandom.com/wiki/VimTip588 "VimTip588")
- [758 Search and sort by selection](https://vim.fandom.com/wiki/VimTip758 "VimTip758")
- [800 Sorting lines in a file based on the number of words in each line](https://vim.fandom.com/wiki/VimTip800 "VimTip800")
- [923 Sort lines by a specified word number](https://vim.fandom.com/wiki/VimTip923 "VimTip923")
- [667 Working with CSV files](https://vim.fandom.com/wiki/VimTip667 "VimTip667") sort by CSV field
- [128 Use Unix command-line tools in Windows](https://vim.fandom.com/wiki/VimTip128 "VimTip128") links to download GNU sort for Windows
- [648 Uniq - Removing duplicate lines](https://vim.fandom.com/wiki/VimTip648 "VimTip648") techniques to remove duplicate lines
## References\[[edit](https://vim.fandom.com/wiki/Sort_lines?veaction=edit§ion=10 "Edit section: References") | [edit source](https://vim.fandom.com/wiki/Sort_lines?section=10&veaction=editsource "Edit section: References")\]
- [:help :sort](http://vimdoc.sourceforge.net/cgi-bin/help?tag=%3Asort)
## \[[edit](https://vim.fandom.com/wiki/Sort_lines?veaction=edit§ion=11 "Edit section: Comments") | [edit source](https://vim.fandom.com/wiki/Sort_lines?section=11&veaction=editsource "Edit section: Comments")\]
*** TO DO ***
- Probably need some general `:sort` command info.
- Give examples of numeric sort and using regex sort.
- Clean up my "see also" list. It's useful now for a comprehensive list of related tips, some of which need work. At least should add a note on point of tip.
- If we're going to mention an external sort tool, we may as well include the following with a brief explanation. Vim could do this, but only with a complex regex. Or perhaps better, mention it in [VimTip374](https://vim.fandom.com/wiki/VimTip374 "VimTip374") or [VimTip923](https://vim.fandom.com/wiki/VimTip923 "VimTip923") in "see also". `-k2` sorts on the second field (word by default).
:!sort -k2
* * *
This misguided snippet was added recently:
delimit the column using some char here I have | symbol as delimiter, once did with that you can use below command to sort specific column use -n if u want to sort numeric and its working on some version of vi and not on ubuntu vi :(
/|.*|/ | sort
used to match a patern |.*| used to match words delimited between || and | as piping commend and sort to sort
This is wrong and should never work. Here's what it is actually doing:
`/|.*|/`: jump to the next line that has two '|' characters in it, anywhere
`|`: command separator, this lets you start a new command on the current line
`sort`: do a default sort of the entire buffer
Basically this is the equivalent of typing `:%sort`.
Now, what you CAN do, is provide a pattern that the `:sort` command will skip over and ignore at the start of every line while sorting. For example, to sort based only on text after the last '|' character on the line (what I think was intended by the example), you'd do this:
:sort /^.*|/