If you are like me you might have used the
sort(1) CLI utility more than once in your life. Today, I’ve found a trick that I’ve never used before, and hopefully it will help someone else in the future.
Say that we have the following file to sort:
fpdy 01 08 wcfo juvi 01 02 ejan urbx 04 03 ckbw fkzq 01 08 myaz fjie 04 09 rhvo almv 04 02 adhs cuah 07 04 gbyt chok 09 06 nqwo emjd 01 04 ledx npto 02 10 nqsc
Now, supposed that I wanted to sort first by the third column and then for the second one, then one would do
sort -k 3 foo.txt. Easy. But what if instead the source file looked like this and I wanted the same results?
fpdy 0108 wcfo juvi 0102 ejan urbx 0403 ckbw fkzq 0108 myaz fjie 0409 rhvo almv 0402 adhs cuah 0704 gbyt chok 0906 nqwo emjd 0104 ledx npto 0210 nqsc
Well, tricky, right? Not really: the
-k accepts the format
F is the field number (
2 in our case) and
C is the character position within the field (
4 in our case) so if we run the following we will achieve what we are looking for:
$ sort -k 2.4 foo.txt almv 0402 adhs juvi 0102 ejan urbx 0403 ckbw cuah 0704 gbyt emjd 0104 ledx chok 0906 nqwo fkzq 0108 myaz fpdy 0108 wcfo fjie 0409 rhvo npto 0210 nqsc
4 and not
3, I don’t know, but I think it’s taking the separator into account. I need to investigate more. But so far I haven’t the need to do something as fine-grained as this, so I can still sleep well at night.