aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDenys Vlasenko <vda.linux@googlemail.com>2015-09-19 22:06:40 +0200
committerDenys Vlasenko <vda.linux@googlemail.com>2015-09-19 22:06:40 +0200
commit8aa7cf305ba5133721aa9852b398cbf1867fc857 (patch)
tree996b5b68c9b4004ffd65d954f19f5bbbe21bc71b
parentf085344d5c4de46d0ef3e15a97ef444fd7cc3194 (diff)
downloadbusybox-w32-8aa7cf305ba5133721aa9852b398cbf1867fc857.tar.gz
busybox-w32-8aa7cf305ba5133721aa9852b398cbf1867fc857.tar.bz2
busybox-w32-8aa7cf305ba5133721aa9852b398cbf1867fc857.zip
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>
-rw-r--r--coreutils/sort.c12
-rwxr-xr-xtestsuite/sort.tests8
2 files changed, 16 insertions, 4 deletions
diff --git a/coreutils/sort.c b/coreutils/sort.c
index 1cb4c3e3f..36f02543b 100644
--- a/coreutils/sort.c
+++ b/coreutils/sort.c
@@ -25,14 +25,14 @@
25//usage: "\n -f Ignore case" 25//usage: "\n -f Ignore case"
26//usage: "\n -g General numerical sort" 26//usage: "\n -g General numerical sort"
27//usage: "\n -i Ignore unprintable characters" 27//usage: "\n -i Ignore unprintable characters"
28//usage: "\n -k Sort key"
29//usage: "\n -M Sort month" 28//usage: "\n -M Sort month"
30//usage: ) 29//usage: )
30//-h, --human-numeric-sort: compare human readable numbers (e.g., 2K 1G)
31//usage: "\n -n Sort numbers" 31//usage: "\n -n Sort numbers"
32//usage: IF_FEATURE_SORT_BIG( 32//usage: IF_FEATURE_SORT_BIG(
33//usage: "\n -o Output to file" 33//usage: "\n -o Output to file"
34//usage: "\n -k Sort by key" 34//usage: "\n -t CHAR Field separator"
35//usage: "\n -t CHAR Key separator" 35//usage: "\n -k N[,M] Sort by Nth field"
36//usage: ) 36//usage: )
37//usage: "\n -r Reverse sort order" 37//usage: "\n -r Reverse sort order"
38//usage: IF_FEATURE_SORT_BIG( 38//usage: IF_FEATURE_SORT_BIG(
@@ -143,6 +143,9 @@ static char *get_key(char *str, struct sort_key *key, int flags)
143 } 143 }
144 } 144 }
145 } 145 }
146 /* Remove last delim: "abc:def:" => "abc:def" */
147 if (key_separator && j && end != 0)
148 end--;
146 } 149 }
147 if (!j) start = end; 150 if (!j) start = end;
148 } 151 }
@@ -163,7 +166,8 @@ static char *get_key(char *str, struct sort_key *key, int flags)
163 if (start > len) start = len; 166 if (start > len) start = len;
164 } 167 }
165 /* Make the copy */ 168 /* Make the copy */
166 if (end < start) end = start; 169 if (end < start)
170 end = start;
167 str = xstrndup(str+start, end-start); 171 str = xstrndup(str+start, end-start);
168 /* Handle -d */ 172 /* Handle -d */
169 if (flags & FLAG_d) { 173 if (flags & FLAG_d) {
diff --git a/testsuite/sort.tests b/testsuite/sort.tests
index 68fa3e405..c4b223464 100755
--- a/testsuite/sort.tests
+++ b/testsuite/sort.tests
@@ -98,6 +98,14 @@ testing "sort with non-default leading delim 3" "sort -n -k3 -t/ input" "\
98//b/1 98//b/1
99" "" 99" ""
100 100
101testing "sort with non-default leading delim 4" "sort -t: -k1,1 input" "\
102a:b
103a/a:a
104" "\
105a/a:a
106a:b
107" ""
108
101testing "sort -u should consider field only when discarding" "sort -u -k2 input" "\ 109testing "sort -u should consider field only when discarding" "sort -u -k2 input" "\
102a c 110a c
103" "\ 111" "\