sort + fosdem post
[homepage.git] / blog / posts / 2009 / 02 / sort_gotcha.mdwn
1 # sorting text records on the first column only
2
3 It turns out that [`join`](http://man.cx/join) is a strange
4 beast. Let's say you have two files, which are textual records using
5 TAB as separator, containing different columns beside the first one,
6 which is the record key. Using join you can do cool stuff like `join
7 file1 file2` to obtain a join in the relations sense, by default on
8 the first column.
9
10 The [join manpage](http://man.cx/join) states that the two fields must
11 be sorted on the join field. This is of course to avoid complexity
12 explosion. The annoying thing is that if you forget to do that, you
13 will miss tuples, without any warning, which is not good (and can
14 actually be at least *spotted* avoiding complexity explosion ...).
15 <small>So yeah, if I'm here it's because after having been hit by
16 this, I finally read the fine manpage :-) </small>
17
18 But how to sort on the join field? Turns out that dear old `sort -u
19 file | [sponge](http://packages.debian.org/sid/moreutils) file` is not
20 enough. Why? Because by default it will use *all* keys to sort and
21 then you will end up sorting also on data values; needless to say that
22 such sorting methods is not stable among the two different files you
23 want to sort in turn.
24
25 OK then, let's try with `sort -u -k 1 file | sponge file`. Not even,
26 but close. ... because [`sort`](http://man.cx/sort) with this syntax
27 will *start* sorting at key 1 (which is the default), but then
28 continue sorting with the other keys, in the hope of doing you a
29 favour.
30
31 The magic line is then `sort -u -k 1,1 file | sponge file`, which
32 tells `sort` to (damn) sort using only the first (damned) key and
33 stopping there. Thank you `sort`. Have a nice day.
34
35 <a href="http://www.fosdem.org"><img
36 src="http://www.fosdem.org/promo/going-to" alt="I’m going to FOSDEM,
37 the Free and Open Source Software Developers’ European Meeting" /></a>
38 **PS** I've been sick this week, but I'm definitely getting better, so
39 I can finally announce that I'm going to FOSDEM 2009, yay, see you
40 there!
41
42 [[!tag lang/english planet/debian]]