sort: fix -kN,M handling (was including last separator into the comparison)

Testcase:

$ printf '%s\n' a/a:a a:b | sort -t: -k1,1
a:b
a/a:a

Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
This commit is contained in:
Denys Vlasenko 2015-09-19 22:06:40 +02:00
parent f085344d5c
commit 8aa7cf305b
2 changed files with 16 additions and 4 deletions

View File

@ -25,14 +25,14 @@
//usage: "\n -f Ignore case" //usage: "\n -f Ignore case"
//usage: "\n -g General numerical sort" //usage: "\n -g General numerical sort"
//usage: "\n -i Ignore unprintable characters" //usage: "\n -i Ignore unprintable characters"
//usage: "\n -k Sort key"
//usage: "\n -M Sort month" //usage: "\n -M Sort month"
//usage: ) //usage: )
//-h, --human-numeric-sort: compare human readable numbers (e.g., 2K 1G)
//usage: "\n -n Sort numbers" //usage: "\n -n Sort numbers"
//usage: IF_FEATURE_SORT_BIG( //usage: IF_FEATURE_SORT_BIG(
//usage: "\n -o Output to file" //usage: "\n -o Output to file"
//usage: "\n -k Sort by key" //usage: "\n -t CHAR Field separator"
//usage: "\n -t CHAR Key separator" //usage: "\n -k N[,M] Sort by Nth field"
//usage: ) //usage: )
//usage: "\n -r Reverse sort order" //usage: "\n -r Reverse sort order"
//usage: IF_FEATURE_SORT_BIG( //usage: IF_FEATURE_SORT_BIG(
@ -143,6 +143,9 @@ static char *get_key(char *str, struct sort_key *key, int flags)
} }
} }
} }
/* Remove last delim: "abc:def:" => "abc:def" */
if (key_separator && j && end != 0)
end--;
} }
if (!j) start = end; if (!j) start = end;
} }
@ -163,7 +166,8 @@ static char *get_key(char *str, struct sort_key *key, int flags)
if (start > len) start = len; if (start > len) start = len;
} }
/* Make the copy */ /* Make the copy */
if (end < start) end = start; if (end < start)
end = start;
str = xstrndup(str+start, end-start); str = xstrndup(str+start, end-start);
/* Handle -d */ /* Handle -d */
if (flags & FLAG_d) { if (flags & FLAG_d) {

View File

@ -98,6 +98,14 @@ testing "sort with non-default leading delim 3" "sort -n -k3 -t/ input" "\
//b/1 //b/1
" "" " ""
testing "sort with non-default leading delim 4" "sort -t: -k1,1 input" "\
a:b
a/a:a
" "\
a/a:a
a:b
" ""
testing "sort -u should consider field only when discarding" "sort -u -k2 input" "\ testing "sort -u should consider field only when discarding" "sort -u -k2 input" "\
a c a c
" "\ " "\