8

Using Notepad++ v6.6.8 with TextFX.

How do I sort lines in numeric order rather than alphanumeric?

That is I want lines to sort like:

1
2
10
11
15
20

not:

1
10
11
15
2
20
User
  • 3,597
  • 9
  • 37
  • 50
  • I'm pretty sure it doesn't do either without a plugin. Are you using TextFX? – krowe Sep 08 '14 at 00:18
  • @krowe yes I have TextFX and I'm using `TextFx->TextFX Tools->Sort lines case insensitive (at column)` – User Sep 08 '14 at 00:25
  • I just noticed that my version is way out of date. Line sorting was added to 6.5.2 without a plugin according to the release notes: http://notepad-plus-plus.org/news/notepad-6.5.2-release.html – krowe Sep 08 '14 at 01:04
  • @krowe [This feature](http://superuser.com/questions/762279/sorting-lines-in-notepad-without-textfx-plugin) using not numeric order. – crazypotato Sep 09 '14 at 19:08
  • @crazypotato Check below, I've already suggested a plugin which does. – krowe Sep 09 '14 at 21:15

4 Answers4

8

This is now easy to achieve (at least in Notepad++ 7.5.9):

Use the menu item: Edit -> Line Operations -> Sort Lines As Integers Ascending

(Note if you don't select any text it will sort the entire file, and if you select text it constrains the sorting to the selected text.)

User
  • 3,597
  • 9
  • 37
  • 50
  • You have to ensure that lines are separated with EOL current settings (Edit -> EOL...). I had Linux separator, but the EOL was set to Windows one. So everything was considered as one line. – Master DJon Jan 31 '23 at 21:29
4

I don't know what your file looks like, but I'd use regular expressions to add spaces or zeros before each number to make them the same length (e.g. 2 becomes 002). Then they will sort correctly and you can use another replacement to strip the leading spaces/zeros afterwards.

These are the steps (works for number up to 10 characters)

Find: ^ Replace: 0000000000

Find: \d*(\d{10}) Replace: \1

Sort

Find: ^0* Replace:

It works by adding 10 zeros before the number, even though that's probably too much. The second replacement than takes the last 10 digits of the number to bring everything back to the same length, giving you numbers like 0000000839, 0000000003 etc. Those will sort in the order you want them to sort. Once sorted the last expression will strip all leading zeros so you'll have your original numbers back.

If you need longer numbers just add more zeros to the first replacement, and increase the 10 in the second replacement accordingly. If you're going to do this more often you could record a macro with these steps.

AVee
  • 159
  • 4
  • 1
    This is painful. More easy use `sort` from [UnxUpdates.zip](http://unxutils.sourceforge.net/) `sort -n in.txt>out.txt` – crazypotato Sep 08 '14 at 01:22
  • Fur such simple things tool should make it in one step. If need more steps then better use another tool. – crazypotato Sep 08 '14 at 01:36
  • I agree with both of you, the question was specifically about notepad++ though. And recording it into a macro will make it a single step again. – AVee Sep 08 '14 at 07:12
  • So where actual answer with steps? I will like to see it cause i not sure how i can make regex depend on length string. – crazypotato Sep 08 '14 at 13:28
  • I've added the steps, personally I'd use `sort -n` but if this is part of a common workflow it might make sense to create a macro to do this so you won't have to leave Notepad++ – AVee Sep 08 '14 at 18:28
  • Your regex cut zero completely if its alone and if string format 0000001 and need save this format string. Also sort with macros don't work (only regex works). – crazypotato Sep 09 '14 at 18:54
  • Both issues can be fixed by using any other padding character as long as it sorts before 0, a space would do. But nothing in the question suggests this is relevant. Also, sort does record as a macro if you assign a keyboard shortcut to it. I don't know why it works like that, but I've got a working macro here, so it can be done... – AVee Sep 09 '14 at 19:24
  • Update: using [built-in sort](http://superuser.com/questions/762279/sorting-lines-in-notepad-without-textfx-plugin) works in macros. – crazypotato Sep 09 '14 at 19:51
1

I haven't tried this but there is a plugin which claims to do this (as long as the lines BEGIN with a number). Here is the link: http://www.scout-soft.com/linesort/

Update Ok, that plugin is apparently gone for now. Maybe it doesn't work with newer NP++ versions. Here is another one which I've seen in the plugin manager so it is at least more common: http://william.famille-blum.org/blog/index.php?entry=entry110123-113226

I just tried it on 6.6.9 and it is a little awkward (don't forget to hit the Add button on the dialog) but works perfectly well.

krowe
  • 5,493
  • 1
  • 24
  • 31
0

Select all and copy as text to Excel or other spreadsheet program, use custom sort. Each line should paste as a single cell, A1, B1, etc. Just need to set the field as numeral not text. This is done by setting cell format, or using TEXT function. Paste back to notepad++.

In the more complex case that OP has text mixed with numbers (e.g., "1 First line," "12 Twelfth line"), we can create a sort column to organize the list. Since there is a space after the number, we can find that space to create a column with just the numbers using =LEFT(A1,FIND(" ",A1,1)). After spreading the function to the whole column, we can sort both columns based on the sort column order (i.e., numeric order) and then copy the first column back in the right order. The exact formula to rip the line number will depend on the line format, but the above command should work with minor modification for most cases, otherwise stack exchange has further examples of similar formulas.

J Vook
  • 9
  • 3
  • 1
    Isn't text going to create the problem described in the question? – fixer1234 Aug 31 '16 at 18:31
  • No, just need to set the field as numeral not text. This is done by setting cell format, or using TEXT function. Assuming OP has text mixed with numbers (e.g., "1 First line," "12 Twelfth line"), we can create a sort column to organize the list. Since there is a space after the number, we can find that to create a column with just the numbers using =LEFT(A1,FIND(" ",A1,1)). After spreading the function to the whole column, we can sort both columns based on the sort column order (i.e., numeric order) and then copy the first column back in the right order. – J Vook Sep 02 '16 at 03:41
  • 1
    Yeah I thought so too in my original reply but then I realized OP was asking for sorting whole lines, not just the numbers. – J Vook Sep 04 '16 at 14:34