Sort CSV file by column priority using the "sort" command
I have a csv file, and I would like to sort it by column priority, like "order by". For example:
3;1;2
1;3;2
1;2;3
2;3;1
2;1;3
3;2;1
If this situation was the result of a "select", the "order by" would be as follows: order by column2, column1, column3 - the result would be:
2;1;3
3;1;2
1;2;3
3;2;1
1;3;2
2;3;1
I'd like to know how to get this same result using "sort" command on Unix.
Solution 1:
sort --field-separator=';' --key=2,1,3
Solution 2:
Suppose you have another row 3;10;3
in your unsorted.csv
file. Then I guess you expect a numerically sorted result:
2;1;3
3;1;2
1;2;3
3;2;1
1;3;2
2;3;1
3;10;3
and not an alphabetically sorted one:
2;1;3
3;1;2
3;10;3
1;2;3
3;2;1
1;3;2
2;3;1
To get that, you have to use -n
:
sort --field-separator=';' -n -k 2,2 -k 1,1 -k 3,3 unsorted.csv
It is worth mentioning that 2,2
has to be used. If only 2
is used, then sort
takes the string from beginning of field 2 to the end. 2,2
makes sure that only field 2
is used.
Solution 3:
Charlie's answer above didn't work for me on Cygwin (sort version 2.0, GNU textutils), the following did:
sort -t"," -k2 -k1 -k1