Execute o comando sort no terminal

0

Eu tenho este arquivo:

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

e eu quero classificá-lo lexicograficamente pelo terceiro campo. Para fazer isso eu corro

sort -t ':' -k3 file.txt

e tudo fica bem, exceto as duas últimas linhas em que tenho

nickson:x:999:504:instructor:/home/SI/nickson:/bin/bash
nobody:x:99:99:Nobody:/:/sbin/nologin

que eu acho que deveria estar em posições invertidas. Alguns podem me explicar por que isso está acontecendo?

    
por Ivan Ruski 07.04.2018 / 11:09

1 resposta

5

Você não está classificando somente pelo terceiro campo. Se você não especificar os campos inicial e final, a classificação será feita usando o campo Início do início até o final da linha. De 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. 

Portanto, o :... também está incluído no tipo.

Use -k3,3 se precisar classificar apenas no terceiro campo:

% 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

Com a classificação GNU, você pode verificar o que está acontecendo com --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
         ____________________________
_____________________________________

Os traços imediatamente abaixo de cada linha mostram a seção comparada.

    
por muru 07.04.2018 / 11:42