Classificação de dados com base na segunda coluna de um arquivo


213

Eu tenho um arquivo de duas colunas e nnúmero de linhas.

a coluna 1 contém namese a coluna2 age.

Desejo classificar o conteúdo deste arquivo em ordem crescente com base em age(na segunda coluna).

O resultado deve exibir o nameda pessoa mais jovem juntamente com a namesegunda pessoa mais nova e assim por diante ...

Quaisquer sugestões para um shell de um liner ou script bash.


1
Superset: delimitador personalizado: stackoverflow.com/questions/1037365/…
Ciro Santilli (

Respostas:


330

Você pode usar o sortcomando :

sort -k2 -n yourfile

-n, --numeric-sortcompare de acordo com o valor numérico da sequência

Por exemplo:

$ cat ages.txt 
Bob 12
Jane 48
Mark 3
Tashi 54

$ sort -k2 -n ages.txt 
Mark 3
Bob 12
Jane 48
Tashi 54

1
note também que utilizando -hem vez de -nvai valores legíveis tipo humanos como 2Gou 3Kbem como números separados por vírgulas, por exemplo1,234.5
chillitom

Problema com pedido "errado". Preste atenção ao man "*** AVISO *** O código do idioma especificado pelo ambiente afeta a ordem de classificação. Configure LC_ALL=Cpara obter a ordem de classificação tradicional que usa valores de bytes nativos." (para maiúsculas e minúsculas sem -n)
x'ES

Isso não considera espaços na primeira coluna nem funciona se houver mais colunas após a segunda, desde -k lida até o final da linha. Supondo que é um arquivo TSV uma solução melhor ésort -t$'\t' -k2 -n FILE
tuxErrante

talvez seja necessário especificar o seu delimitador usando a opção -t
espectro

85

Solução:

sort -k 2 -n filename

escrito mais detalhadamente como:

sort --key 2 --numeric-sort filename


Exemplo:

$ cat filename
A 12
B 48
C 3

$ sort --key 2 --numeric-sort filename 
C 3
A 12
B 48

Explicação:

  • -k # - este argumento especifica a primeira coluna que será usada para classificar. (observe que a coluna aqui é definida como um campo delimitado por espaço em branco; o argumento -k5será classificado começando com o quinto campo em cada linha, não o quinto caractere em cada linha)

  • -n - esta opção especifica uma "classificação numérica", significando que a coluna deve ser interpretada como uma linha de números, em vez de texto.


Mais:

Outras opções comuns incluem:

  • -r - esta opção reverte a ordem de classificação. Também pode ser escrito como - reverso .
  • -i - Esta opção ignora caracteres não imprimíveis. Também pode ser escrito como --ignore-nonprinting .
  • -b - Esta opção ignora os espaços em branco iniciais, o que é útil, pois são usados ​​espaços em branco para determinar o número de linhas. Também pode ser escrito como --ignore-líderes-espaços em branco .
  • -f - Esta opção ignora letras maiúsculas. "A" == "a". Também pode ser escrito como --ignore-case .
  • -t [novo separador] - Esta opção faz com que o pré-processamento use um operador que não seja o espaço. Também pode ser escrito como --field-separator .

Existem outras opções, mas essas são as mais comuns e úteis, que eu uso com frequência.


@ Angelo Esta resposta foi postada presumivelmente anos depois que você aceitou uma resposta para esta pergunta, mas você a considerou a nova resposta aceita?
Jonathan Y.

A opção -tfoi salva-vidas da vida real !! quando suas colunas têm espaços e as colunas diferem por um determinado caractere como ,ou uma guia
AKS

12

Para valores separados por tabulação, o código abaixo pode ser usado

sort -t$'\t' -k2 -n

-r pode ser usado para obter dados em ordem decrescente.
-n para ordenação numérica
-k, --key = POS1 [, POS2] onde k é a coluna no arquivo.
Para a ordem decrescente abaixo, está o código

sort -t$'\t' -k2 -rn

4

Use sort.

sort ... -k 2,2 ...

8
Você também precisa usar -n para classificar com base nas idades (classificação numérica). Caso contrário, '11' virá antes de '2'.
Matt Ryall
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.