Você pode usar vários -ksinalizadores para classificar em mais de uma coluna. Por exemplo, para classificar por sobrenome e depois pelo nome como fator de desempate:
sort -k 2,2-k 1,1 file.txt
Opções relevantes de "classificação manual":
-k, --key = POS1 [, POS2]
iniciar uma chave em POS1, finalizá-la em POS2 (origem 1)
POS é F [.C] [OPTS], onde F é o número do campo e C a posição do caractere no campo. OPTS é uma ou mais opções de pedido de uma única letra, que substituem as opções de pedido globais para aquela chave. Se nenhuma chave for fornecida, use a linha inteira como chave.
-t, --field-separator = SEP
use SEP em vez de transição de não-branco para branco
Basta ter um pouco de cuidado ao usar --field-separator=','se você tiver um operador de entrada de dados digitando valores para "Nome" como "Billy Bob" ou qualquer outra coisa ... espaços podem facilmente entrar em seus dados se você não se proteger, mas vírgulas são relativamente improváveis.
Tony Delroy
1
Há casos muito prováveis de vírgulas nesses campos, como "Smith, Jr." ou "McDowell, Sr." ou "Dr. John" ou "New York, NY"
jbnunn
2
Observe que se as colunas estiverem alinhadas visualmente, ou seja, houver um número não constante de espaços entre cada campo, você deve usar a -bopção. Isso ocorre porque, sortna verdade, consideramos que a string a ser classificada começa logo após a vírgula, e não a partir da primeira letra da coluna. Além disso, você pode precisar prefixar o comando com LC_ALL=C, para evitar qualquer efeito colateral devido ao local, o que pode acontecer até mesmo em um arquivo ASCII simples.
calandoa
@calandoa Obrigado pela parte em -b( --ignore-leading-blanks). Para esclarecer um pouco: echo -e 'aa<SPACE>a\na<SPACE><SPACE>b' | sort -k2dá a<SPACE><SPACE>bprimeiro (a segunda coluna começa depois da primeira non-blank to blank transitione <SPACE><SPACE>bé antes <SPACE>a), mas com -bisso dá aa<SPACE>acomo esperado ( aé antes b).
Kirill Bulygin
7
Para classificar apenas pelo segundo campo (assim, onde os segundos campos correspondem, as linhas com correspondências permanecem na ordem em que estão no original, sem classificação em outros campos):
Respostas:
Se este for UNIX:
Você pode usar vários
-k
sinalizadores para classificar em mais de uma coluna. Por exemplo, para classificar por sobrenome e depois pelo nome como fator de desempate:Opções relevantes de "classificação manual":
fonte
--field-separator=','
se você tiver um operador de entrada de dados digitando valores para "Nome" como "Billy Bob" ou qualquer outra coisa ... espaços podem facilmente entrar em seus dados se você não se proteger, mas vírgulas são relativamente improváveis.-b
opção. Isso ocorre porque,sort
na verdade, consideramos que a string a ser classificada começa logo após a vírgula, e não a partir da primeira letra da coluna. Além disso, você pode precisar prefixar o comando comLC_ALL=C
, para evitar qualquer efeito colateral devido ao local, o que pode acontecer até mesmo em um arquivo ASCII simples.-b
(--ignore-leading-blanks
). Para esclarecer um pouco:echo -e 'aa<SPACE>a\na<SPACE><SPACE>b' | sort -k2
dáa<SPACE><SPACE>b
primeiro (a segunda coluna começa depois da primeiranon-blank to blank transition
e<SPACE><SPACE>b
é antes<SPACE>a
), mas com-b
isso dáaa<SPACE>a
como esperado (a
é antesb
).Para classificar apenas pelo segundo campo (assim, onde os segundos campos correspondem, as linhas com correspondências permanecem na ordem em que estão no original, sem classificação em outros campos):
fonte
FWIW, aqui está um método de classificação para mostrar quais processos estão usando mais memória virtual.
As opções de classificação são definidas para a primeira coluna, usando: como separador de coluna, classificação numérica e classificação inversa.
fonte
Da mesma forma, você pode alterar o número da coluna.
fonte