У меня есть этот файл:
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin
nickson:x:999:504:instructor:/home/SI/nickson:/bin/bash
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
sync:x:5:0:sync:/sbin:/bin/sync
shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
halt:x:7:0:halt:/sbin:/sbin/halt
mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
uucp:x:10:14:uucp:/var/spool/uucp:/sbin/nologin
operator:x:11:0:operator:/root:/sbin/nologin
games:x:12:100:games:/usr/games:/sbin/nologin
gopher:x:13:30:gopher:/var/gopher:/sbin/nologin
ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin
ntp:x:38:38::/etc/ntp:/sbin/nologin
apache:x:48:48:Apache:/var/www:/sbin/nologin
vcsa:x:69:69:virtual console memory owner:/dev:/sbin/nologin
postfix:x:89:89::/var/spool/postfix:/sbin/nologin
sshd:x:74:74:Privilege-separated SSH:/var/empty/sshd:/sbin/nologin
nobody:x:99:99:Nobody:/:/sbin/nologin
saslauth:x:499:76:"Saslauthd user":/var/empty/saslauth:/sbin/nologin
sabina:x:500:500:Joen Doe:/home/joendoe:/bin/bash
student:x:501:501::/home/student:/bin/bash
svi:x:502:500:foo fooo:/home/svi:/bin/bash
tslavova:x:503:500:foo ofoofofo:/home/das:/bin/bash
jbabukov:x:504:500:ofofofo f of of o:/home/adas:/bin/bash
griza:x:505:500:asdasdas:/home/dasd:/bin/bash
moni:x:506:500:adsdasd:/home/dasi:/bin/bash
victoria:x:507:500:asdasd:/home/dadfeia:/bin/bash
kiril:x:508:500:asdasd:/home/kdasdail:/bin/bash
и я хочу отсортировать его лексикографически по третьему полю. Чтобы сделать это, я работаю
sort -t ':' -k3 file.txt
и все выглядит хорошим кроме последних двух строк, где я имею
nickson:x:999:504:instructor:/home/SI/nickson:/bin/bash
nobody:x:99:99:Nobody:/:/sbin/nologin
то, которое я думаю, должно быть в обратных положениях. Некоторые могут объяснить мне, почему это происходит?
Вы не сортируете только по третьему полю. Если Вы не указываете и запускаете и заканчиваете поля, сортировка сделана с помощью запуска поля запуска в конец строки. От man sort
:
KEYDEF is F[.C][OPTS][,F[.C][OPTS]] for start and stop position, where
F is a field number and C a character position in the field; both are
origin 1, and the stop position defaults to the line's end.
Так :...
также включен в вид.
Использовать -k3,3
если необходимо отсортировать только на третьем поле:
% sort -t: -k3,3 foo | grep '^n'
ntp:x:38:38::/etc/ntp:/sbin/nologin
nobody:x:99:99:Nobody:/:/sbin/nologin
nickson:x:999:504:instructor:/home/SI/nickson:/bin/bash
С видом GNU можно проверить то, что происходит с --debug
:
$ sort -t: -k3,3 foo --debug | tail
sort: using ‘en_GB.UTF-8’ sorting rules
______________________________________________
postfix:x:89:89::/var/spool/postfix:/sbin/nologin
__
_________________________________________________
nobody:x:99:99:Nobody:/:/sbin/nologin
__
_____________________________________
nickson:x:999:504:instructor:/home/SI/nickson:/bin/bash
___
_______________________________________________________
$ sort -t: -k3 foo --debug | tail
sort: using ‘en_GB.UTF-8’ sorting rules
______________________________________________
postfix:x:89:89::/var/spool/postfix:/sbin/nologin
_______________________________________
_________________________________________________
nickson:x:999:504:instructor:/home/SI/nickson:/bin/bash
_____________________________________________
_______________________________________________________
nobody:x:99:99:Nobody:/:/sbin/nologin
____________________________
_____________________________________
Тире сразу ниже каждой строки показывают сравненный раздел.