(Added the "ranges" cheat sheet from the Ranges page.) |
(Undo revision 39075 by 192.150.73.149 (talk) when using built-in sort command, you don't need to prefix arguments with "-". That's only for the external command (with a '!')) Tag: sourceedit |
||
(18 intermediate revisions by 13 users not shown) | |||
Line 19: | Line 19: | ||
Yes, it's that simple. |
Yes, it's that simple. |
||
− | You could create a range in advance, such as < |
+ | 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: |
If you like using an external sort utility instead, you can do it just as easily. For example, Unix sort, removing duplicate lines: |
||
Line 27: | Line 27: | ||
</pre> |
</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 < |
+ | 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). |
− | |||
− | {{:Ranges}} |
||
− | |||
==Examples== |
==Examples== |
||
− | ===Sort |
+ | ===Sort in reverse=== |
⚫ | |||
− | ===Sort 3 lines, starting from the cursor=== |
||
⚫ | |||
− | === Sort lines 20-44 === |
||
− | <pre>:20,44sort</pre> |
||
− | === Sort in reverse === |
||
<pre>:%sort!</pre> |
<pre>:%sort!</pre> |
||
+ | |||
− | === |
+ | ===Sort, removing duplicate lines=== |
<pre>:%sort u</pre> |
<pre>:%sort u</pre> |
||
+ | |||
===Sort using the external Unix sort utility, respecting month-name order=== |
===Sort using the external Unix sort utility, respecting month-name order=== |
||
<pre>:%!sort -M</pre> |
<pre>:%!sort -M</pre> |
||
("respecting month-name order" means January < February < ... < December) |
("respecting month-name order" means January < February < ... < December) |
||
+ | |||
+ | ===Numeric sort=== |
||
⚫ | |||
+ | (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> |
||
==See also== |
==See also== |
||
Line 61: | Line 61: | ||
==Comments== |
==Comments== |
||
− | * I added a page called [[Ranges]] to help with beginner-to-intermediate tips on constructing ranges in Vim. Part of that page has a little "ranges cheat sheet" which I have marked as a transclusion element and incorporated into the document above. ([[User:Sirrobert|sirrobert@gmail.com]] 16:54, 19 December 2008 (UTC)) |
||
− | |||
{{Todo}} |
{{Todo}} |
||
⚫ | |||
− | *Now that tip has been renamed, it should not start with 'sort unique'. It should start with a brief overview, then have a heading before the first meaty bit (then, the TOC will be in a more appropriate place). |
||
⚫ | |||
*Give examples of numeric sort and using regex sort. |
*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. |
*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". < |
+ | *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> |
<pre> |
||
:!sort -k2 |
:!sort -k2 |
||
Line 75: | Line 72: | ||
---- |
---- |
||
+ | 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 :( |
||
+ | |||
⚫ | |||
+ | |||
+ | :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> |
Revision as of 20:39, 26 April 2016
created 2006 · complexity basic · author Robert Stovall · version 7.0
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
Sort in reverse
:%sort!
Sort, removing duplicate lines
:%sort u
Sort using the external Unix sort utility, respecting month-name order
:%!sort -M
("respecting month-name order" means January < February < ... < December)
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
:g/start/+1,/end/-1 sort n
See also
- 374 Use filter commands to process text
- 588 How to sort using visual blocks
- 758 Search and sort by selection
- 800 Sorting lines in a file based on the number of words in each line
- 923 Sort lines by a specified word number
- 667 Working with CSV files sort by CSV field
- 128 Use Unix command-line tools in Windows links to download GNU sort for Windows
- 648 Uniq - Removing duplicate lines techniques to remove duplicate lines
References
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 or 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 /^.*|/