Arquivo de classificação do shell do Linux de acordo com a segunda coluna?

88

Eu tenho um arquivo como este:

FirstName, FamilyName, Address, PhoneNumber

Como posso classificá-lo por FamilyName?

Rami Jarrar
fonte
qual sistema operacional e processador de comando?
Preet Sangha
1
Possível duplicata de Unix Sort with Tab Delimiter
Ciro Santilli 郝海东 冠状 病 六四 事件 法轮功

Respostas:

152

Se este for UNIX:

sort -k 2 file.txt

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

John Kugelman
fonte
2
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 -k2a<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):

sort -k 2,2 -s orig_file > sorted_file
Cian
fonte
3

FWIW, aqui está um método de classificação para mostrar quais processos estão usando mais memória virtual.

memstat | sort -k 1 -t':' -g -r | less

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.

netskink
fonte
2
sort -nk2 file.txt

Da mesma forma, você pode alterar o número da coluna.

Dheeraj Kumar
fonte