Vim Tips Wiki
Explore
Main Page
All Pages
Community
Interactive Maps
Community portal
To do
FANDOM
Fan Central
BETA
Games
Anime
Movies
TV
Video
Wikis
Explore Wikis
Community Central
Start a Wiki
Don't have an account?
Register
Sign In
Sign In
Register
Vim Tips Wiki
1,649
pages
Explore
Main Page
All Pages
Community
Interactive Maps
Community portal
To do
Editing
Sort lines
Back to page
Edit
Edit source
View history
Talk (1)
Edit Page
Sort lines
We recommend that you
log in
before editing. This will allow other users to leave you a message about your edit, and will let you track edits via your
Watchlist
.
Creating an account
is quick and free.
The edit appears to have already been undone.
Anti-spam check. Do
not
fill this in!
{{TipImported |id=1166 |previous=1164 |next=1167 |created=2006 |complexity=basic |author=Robert Stovall |version=7.0 |rating=29/17 |category1= |category2= }} 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: <pre> :{range}sort u </pre> Yes, it's that simple. You could create a range in advance, such as <code>'a,.</code> (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 <code>'<,'></code> 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: <pre> :{range}!sort -u </pre> 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 <code>:sort</code> command). ==Examples== ===Sort in reverse=== <pre>:%sort!</pre> ===Sort, removing duplicate lines=== <pre>:%sort u</pre> ===Sort using the external Unix sort utility, respecting month-name order=== <pre>:%!sort -M</pre> ("respecting month-name order" means January < February < ... < December) ===Numeric sort=== <pre>:sort n</pre> (this way, 100 doesn't precede 20 in the sort) ===Sort subsections independently, in this example sort numbers between "start" and "end" markers=== <pre>:g/start/+1,/end/-1 sort n</pre>It is very important that the strings "start" and "end" ONLY appear as markers! === Sort only specific lines using ranges === sort lines 296 to 349, inclusive :296,349sort === Sort by pattern === When working with Javascript ES6, it may be useful to sort your imports <pre> 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'; </pre> 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. <pre>:{range}sort /\/[A-z]/</pre> This will organize your imports relative to the "package" they are related to: <pre> 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'; </pre> You can also sort on text that *matches* the regex by including the 'r' flag, for example: <pre>:{range}sort /\/[A-z]/ r</pre> ==See also== *[[VimTip374|374 Use filter commands to process text]] *[[VimTip588|588 How to sort using visual blocks]] *[[VimTip758|758 Search and sort by selection]] *[[VimTip800|800 Sorting lines in a file based on the number of words in each line]] *[[VimTip923|923 Sort lines by a specified word number]] *[[VimTip667|667 Working with CSV files]] sort by CSV field *[[VimTip128|128 Use Unix command-line tools in Windows]] links to download GNU sort for Windows *[[VimTip648|648 Uniq - Removing duplicate lines]] techniques to remove duplicate lines ==References== *{{help|:sort}} ==Comments== {{Todo}} *Probably need some general <code>:sort</code> 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]] or [[VimTip923]] in "see also". <code>-k2</code> sorts on the second field (word by default). <pre> :!sort -k2 </pre> ---- 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 :( <pre>/|.*|/ | sort</pre> :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: <code>/|.*|/</code>: jump to the next line that has two '|' characters in it, anywhere <code>|</code>: command separator, this lets you start a new command on the current line <code>sort</code>: do a default sort of the entire buffer Basically this is the equivalent of typing <code>:%sort</code>. Now, what you CAN do, is provide a pattern that the <code>:sort</code> 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: <pre> :sort /^.*|/ </pre>
Summary:
Please note that all contributions to the Vim Tips Wiki are considered to be released under the CC-BY-SA
Cancel
Editing help
(opens in new window)
Templates used on this page:
Template:Help
(
view source
)
Template:Navigation
(
view source
)
Template:TipImported
(
view source
)
Template:Todo
(
view source
)
Follow on IG
TikTok
Join Fan Lab