Comandos Linux

Comando Bash Sort

Comando Bash Sort
Boa sorte ao tentar implementar um algoritmo de classificação no bash que termine antes de amanhã. Não se preocupe, você não precisa porque tem o comando sort.

Com a classificação, você pode ordenar os arquivos com base na ordem no dicionário ou por valor numérico, randomizar as linhas do arquivo, remover linhas duplicadas e verificar se um arquivo está classificado.

Você pode ser capaz de fazer outras coisas com ele, mas primeiro, vamos nos preocupar em entender como usar a classificação em scripts bash.

O que é tipo?

Sortéum comando externo que concatena arquivos enquanto classifica seu conteúdo de acordo com um tipo de classificação e grava os resultados da classificação na saída padrão.

Classificar opções de comando para o bash

O comando sort vem com 31 opções (13 principais e 18 categorizadas como outras). A maioria dos experientes em programação bash (até mesmo os especialistas) conhecem apenas algumas opções principais de classificação necessárias para sobreviver. Outros raramente são tocados. Sorte sua que temos tempo para tocar todos eles.

Opções de classificação principais

Estas são as opções que o ajudam a fazer as coisas e classificar (classificação), além de manipular os resultados classificados (pós-processamento) e aplicar filtros (filtros) antes de classificar.

Ordenação

Sort vem com 5 tipos diferentes de classificação. Aqui está uma tabela mostrando cada tipo de classificação com opções associadas.

Ordenar Opção curta / opção longa / etc
palavra
Classificação numérica (geral) -g / -general-numeric-sort
geral-numérico
suporte para notação científica
0.1234e4 = 1234
Classificação numérica (humana) -h / -human-numeric-sort
humano-numérico
1.234K = 1234
Numérico -n / -numeric-sort
numérico
… < -1 < 0 < 1 <…
Mês -M / -month-sort
mês
Desconhecido < Jan < Feb <… < Nov < Dec
Aleatório -r / -random-sort
aleatória
Versão -V / -version-sort
versão

Observe que cada tipo de classificação tem uma opção longa terminando com -sort. Além de opções de classificação específicas, a opção -sort = WORD pode ser usada para classificar por palavra. Por exemplo, -sort = random pode ser usado no lugar de -random-sort ou -r.

Exemplos

Aqui estão alguns exemplos de comando de classificação para cada método de classificação.

Exemplo) Classificação de nomes

Classificar não tem problemas para classificar as linhas em ordem alfabética. Considere uma lista de pessoas famosas não classificada.

Função

pessoas famosas()

curl --silent https: // www.biografia de linha.net / pessoas / famosos-100.html
| grep post-content | sed -e 's /<[^>] *.// g '-e' s / Segunda Guerra Mundial // g '-e' s / \ (Wilbur \)
/ \ 1 Wright / '| grep -o -e '\ (\ ([A-Z] \ + [.] \?\) \ + [a-z] * \ s \) \ + ([0-9] \ + \ s [^)] \+.'

Linha de comando

pessoas famosas | ordenar

Resultado

Stephen King (1947 -)
Steve Jobs (1955 - 2012)
Sting (1951 -)
Tiger Woods (1975 -)
Tom Cruise (1962 -)
Usain Bolt (1986 -)
Vinci (1452 - 1519)
Walt Disney (1901 - 1966)
Wilbur Wright (1867 - 1912)
Woodrow Wilson (1856 - 1924)

Exemplo) classificação numérica geral

Se precisarmos classificar os valores numéricos levando em consideração a notação científica, como 99e2, podemos usar a classificação numérica geral.

Função

valores numéricos não classificados ()

seq 100 | sort --random-sort | sed '3i 9e2' | sed '3i 99K'

Considere a saída classificada usando cada método. Observe que, além de conter os valores de 1 a 100, a lista também inclui '9e12' (900) e '99K' (99000).

Linha de comando

valores numéricos não classificados | sort -n

Resultado

96
97
98
99
99K
100

Que tal 900 e 99.000. Isso mesmo, é apenas uma classificação numérica. Próximo.

Linha de comando

valores numéricos não classificados | sort -h

Resultado

96
97
98
99
100
99K

Que tal 900. Isso mesmo, é apenas uma classificação numérica humana. Próximo.

Linha de comando

valores numéricos não classificados | sort -g

Resultado

96
97
98
99
99K
100
9e2

Que tal 99.000. Isso mesmo, é apenas uma classificação numérica geral. Como você vê, nenhum método de classificação é compatível neste caso; no entanto, isso não significa que você não pode encontrar uma solução.

Linha de comando

valores numéricos não classificados | sed 's / [kK] / e3 /' | sort -g

Resultado

96
97
98
99
100
9e2
99e3

Agora isso é mais parecido com isso.

Exemplo) classificação numérica humana

Se precisarmos classificar os valores numéricos levando em consideração o significado de notações como K, G, M e E, podemos usar a classificação numérica humana.

Linha de comando

seq 100 | sort --random-sort | sed '3i 3k' | sort -h

Resultado

96
97
98
99
100
3k

Exemplo) classificação numérica

Se tudo o que precisamos é classificar números inteiros, a classificação numérica faz o truque.

Linha de comando

seq 100 | sort --random-sort | sort --numerics-sort

Resultado

95
96
97
98
99
100

Exemplo) classificação por mês

A classificação por mês permite que você ordene as linhas por mês. Pode ser útil para agrupar linhas por mês, especialmente no caso de a opção de classificação por tempo não estar disponível.

Função

meses ()

gato  <Jan
Fev
Mar
Abr
Maio
Junho
Jul
Agosto
Set
Out
Nov
Dez
EOF

Suponha que os meses não sejam classificados.

Linha de comando

meses | sort --random-sort

Resultado

Mar
Out
Dez
Abr
Maio
Set
Agosto
Nov
Jul
Jan
Fev
Junho

Podemos sempre classificar por mês.

Linha de comando

meses | sort --random-sort | sort --month-sort

Resultado

Jan
Fev
Mar
Abr
Maio
Junho
Jul
Agosto
Set
Out
Nov
Dez

Observe que se alterarmos dezembro para qualquer substring em novembro, dizer 'Novem', ele aparecerá após 'Nov' na saída classificada.

Exemplo) Classificação aleatória - mata o terminal de outra pessoa

Como esperado, a classificação aleatória faz o oposto da classificação, mistura as linhas.

Suponha que, para fins educacionais, queiramos matar outro usuário. Teríamos que ter certeza de que não é nosso pty e randomizar as listagens para que fiquem mais agradáveis ​​e que possamos dizer que os ptys foram selecionados aleatoriamente.

Comandos

message-pty ()


pty local;
pty = "$ 1"
;
echo -n "Você está indo para baixo em"> / dev / $ pty;
para i em 5 4 3 2 1;
Faz
dormir 1;
echo -n "$ i"> / dev / $ pty;
feito;
echo "Tchau!"> / dev / $ pty;
dormir 1


ps | grep pty | grep -v -e $ (mypty) | sort --random-sort | cabeça -1> stdin;

message-pty $ (pty < stdin );
kill $ (pid < stdin )


Saída no terminal de outra pessoa
Você vai cair em 5 4 3 2 1 Tchau!]
(saída)

Exemplo) Classificação de versão - ips de classificação

Como você sabe, os arquivos de origem podem ser versionados usando strings como 1.0. Além disso, as versões podem ser mais profundas com números de versão como 1.0.0, como visto em esquemas populares de versão semântica.

Classificação de versão permite que você classifique os números de versão. Excelente! O que agora? Vamos testar isso.

Para este exemplo, preparei um script bash para gerar ips aleatórios para que não tenhamos que ir lá. Está no repo. Para aqueles de nós que não têm o repositório, aqui está um início rápido.

Comandos

git clone https: // github.com / temptemp3 / linuxhint.com.idiota
alias random-ips = 'test -f "linuxhint.com / generate-random-ips.sh "; bash $ _ '

Agora que você está pronto, vamos começar.

Linha de comando

random-ips 200 | tee ips

Resultado

199.174.177.98
180.33.247.107
87.130.125.109
76.86.8.20
162.41.183.150
226.58.10.196
83.121.11.145
80.199.197.19
44.214.89.52
185.174.143.111

Ok funciona. Agora vamos ver o que acontece quando tentamos classificar ips.

Linha de comando

classificar ips

Resultado

76.88.194.157
8.96.11.181
82.169.213.206
84.218.132.51
84.3.101.97
87.137.131.40
87.59.32.91
89.149.111.242
97.121.162.244
98.145.130.186

À primeira vista, parece funcionar, mas linhas como 8.96.11.181 deve aparecer em outro lugar.

Comandos


para o em d h n V g M
Faz
classificar ips - $ o> ips $ o ,,
feito

echo todos os tipos de classificação numérica igual
diff ips n, d 1> / dev / null || ordem de dicionário de eco != classificação numérica
diff ips n, h 1> / dev / null || echo human numeric sort != classificação numérica
diff ips n, g 1> / dev / null || echo classificação numérica geral != classificação numérica
diff ips n, v 1> / dev / null ||
tipo de versão de eco != classificação numérica
show_n_v_ips_diff = "verdadeiro"


teste ! "$ show_n_v_ips_diff" || diff ips n, v

Resultado

todos os tipos são iguais à classificação numérica
ordem de dicionário != classificação numérica
classificação de versão != classificação numérica
13,14d12
< 44.221.43.20
< 44.27.108.172
15a14,15
> 44.27.108.172
> 44.221.43.20
27d26
< 84.218.132.51
29c28
< 87.137.131.40

Como você vê, a classificação de versão permite que você classifique os números de versão quando outros métodos de classificação falham.

Exemplo) Classificação de versão - classificação de nomes de arquivo com números de versão

Com base no último exemplo, vamos usar a classificação de versão um pouco mais próxima do uso pretendido. Como você sabe, os números de versão geralmente aparecem em nomes de arquivos. Veja os detalhes sobre a classificação da versão.

Primeiro, vamos transformar ips em algo mais arquivo de origem do projeto.

Comandos

alpha ()
alpha = "abcdefghijklmnopqrstuvwxyz";
echo -n $ alpha: $ ((RANDOM% 26)): 1

beta ()
alfa = "ab";
echo -n $ alpha: $ ((RANDOM% 2)): 1


gato ips | enquanto lê -r linha; Faz
echo $ (alpha) -v $ line $ (test $ ((RANDOM% 5)) -eq 0 || beta).alcatrão.gz;
feito | tee sips

Resultado

x-v56.16.109.54.alcatrão.gz
k-v117.38.14.165a.alcatrão.gz
d-v87.59.32.91a.alcatrão.gz
h-v115.215.64.100.alcatrão.gz
s-v72.174.246.218b.alcatrão.gz
h-v163.93.19.173.alcatrão.gz
u-v184.225.11.92b.alcatrão.gz
y-v205.53.5.211a.alcatrão.gz
t-v175.196.164.17b.alcatrão.gz
e-v167.42.221.178b.alcatrão.gz
c-v126.54.190.189b.alcatrão.gz
b-v169.180.221.131a.alcatrão.gz
y-v210.125.170.231a.alcatrão.gz
x-v71.56.120.9b.alcatrão.gz

Exercício

Faça os comandos acima rodarem mais rápido usando o xargs

Veja o exemplo de como usar o comando xargs em scripts bash.

Desta vez, nem nos incomodaremos em usar nenhum dos outros métodos de classificação.

Linha de comando

sort -V goles

Resultado

d-v127.100.108.192.alcatrão.gz
e-v62.140.229.42a.alcatrão.gz
e-v149.77.211.215a.alcatrão.gz
e-v167.42.221.178b.alcatrão.gz
e-v194.189.236.29a.alcatrão.gz
e-v198.145.199.84b.alcatrão.gz
e-v240.1.147.196b.alcatrão.gz
f-v50.100.142.42b.alcatrão.gz
f-v117.58.230.116.alcatrão.gz
f-v139.17.210.68b.alcatrão.gz
f-v153.18.145.133b.alcatrão.gz
g-v201.153.203.60b.alcatrão.gz
g-v213.58.67.108.alcatrão.gz
h-v5.206.37.224.alcatrão.gz

Agora você vê que a classificação de versão pode ser útil ao classificar nomes de arquivos com números de versão.

Pré classificar

Classificar tem quatro opções principais que afetam a classificação real, a saber, -ignore-lead-blanks, -ignore-case, -ignore-nonprinting e -dictionary-order, que pode ou não se sobrepor. Exemplo de uso de cada opção a seguir.

Classificar ignorando espaços em branco à esquerda

A classificação permite que os espaços em branco à esquerda sejam ignorados como uma opção. Os espaços em branco à esquerda são preservados na saída classificada.

Opção

--ignorar os espaços em branco

Uso

sort --ignore-lead-blanks

Comandos

pessoas famosas> fp
cat >> fp << EOF
Marilyn Monroe (1926 - 1962)
Abraham Lincoln (1809 - 1865)
EOF
gato fp | sort | tac

Resultado

Alfred Hitchcock (1899 - 1980)
Albert Einstein (1879 - 1955)
Al Gore (1948 -)
Abraham Lincoln (1809 - 1865)
Marilyn Monroe (1926 - 1962)
Abraham Lincoln (1809 - 1865)

Observe que os espaços iniciais nas linhas adicionadas a fp aparecem primeiro na saída de classificação.

Para corrigir isso, precisamos ignorar os espaços em branco à esquerda da seguinte forma.

Comandos

pessoas famosas> fp
cat >> fp << EOF
Marilyn Monroe (1926 - 1962)
Abraham Lincoln (1809 - 1865)
EOF
gato fp | sort --ignore-Lead-blanks --ignore-Lead-blanks | tac

Resultado

Marilyn Monroe (1926 - 1962)
Marilyn Monroe (1926 - 1962)
Maria Antonieta (1755 - 1793)

Albert Einstein (1879 - 1955)
Al Gore (1948 -)
Abraham Lincoln (1809 - 1865)
Abraham Lincoln (1809 - 1865)

Alternativas

gato fp | sed 's / ^ \ s * //' | sort | tac

Observe que a alternativa não preserva os espaços em branco à esquerda na saída de classificação.

Classificar ignorando maiúsculas e minúsculas

A classificação permite que o caso de entrada seja ignorado como uma opção. O caso é preservado na saída classificada.

Opção

--ignorar caso

Uso

sort --ignore-case

Comandos

pessoas famosas> fp
cat >> fp << EOF
abraham Lincoln (1809 - 1865)
ABraham Lincoln (1809 - 1865)
EOF
gato fp | sort | tac

Resultado

Amelia Earhart (1897 - 1937)
Alfred Hitchcock (1899 - 1980)
Albert Einstein (1879 - 1955)
Al Gore (1948 -)
Abraham Lincoln (1809 - 1865)
ABraham Lincoln (1809 - 1865)

Observe que os espaços iniciais nas linhas adicionadas a fp aparecem primeiro na saída de classificação.

Para corrigir isso, precisamos ignorar os espaços em branco à esquerda da seguinte forma.

Comandos

pessoas famosas> fp
cat >> fp << EOF
abraham Lincoln (1809 - 1865)
ABraham Lincoln (1809 - 1865)
EOF
gato fp | sort --ignore-case | tac

Resultado

Amelia Earhart (1897 - 1937)
Alfred Hitchcock (1899 - 1980)
Albert Einstein (1879 - 1955)
Al Gore (1948 -)
Abraham Lincoln (1809 - 1865)
abraham Lincoln (1809 - 1865)
ABraham Lincoln (1809 - 1865)

Alternativas

gato fp | enquanto lê -r linha; faça echo $ line ,,; feito | sort | tac

Observe que a alternativa não preserva o caso na saída de classificação.

Classificar ignorando não imprimível

A classificação permite que a entrada não impressa seja ignorada como uma opção. A não impressão é preservada na saída classificada.

Opção

--ignorar não imprimível

Uso

sort --ignore-nonprinting

Comandos

pessoas famosas> fp
echo -e "\ x90Abe" >> fp
gato fp | sort | tac

Resultado

Audrey Hepburn (1929 - 1993)
Angelina Jolie (1975 -)
Amelia Earhart (1897 - 1937)
Alfred Hitchcock (1899 - 1980)
Albert Einstein (1879 - 1955)
Al Gore (1948 -)
Abraham Lincoln (1809 - 1865)

Parece que está faltando um 'Abe' para caracteres não imprimíveis na entrada de classificação.

Para corrigir isso, precisamos ignorar os caracteres não imprimíveis.

Comandos

pessoas famosas> fp
echo -e "\ x90Abe" >> fp
gato fp | sort --ignore-nonprinting | tac
[/ cc \
Resultado
[cc lang = "bash"]
Amelia Earhart (1897 - 1937)
Alfred Hitchcock (1899 - 1980)
Albert Einstein (1879 - 1955)
Al Gore (1948 -)
Abraham Lincoln (1809 - 1865)
▒Abe

Classificar a ordem do dicionário

A classificação permite que todas as entradas sejam ignoradas, exceto espaços e caracteres alfanuméricos como uma opção. A entrada é preservada na saída classificada.

pessoas famosas> fp
echo -e "\ x90Abe" >> fp
gato fp | sort --d | tac

Classificação de postagem

Classificar tem uma opção principal que não afeta a classificação, a saber, -reverse. No entanto, isso afeta a saída, permitindo que a ordem seja alternada entre ascendente e descendente. Segue um exemplo.

Classificar saída reversa

Classificar permite que a saída seja exibida em ordem reversa como uma opção.

Opção

--marcha ré

Uso

sort --reverse

Linha de comando

pessoas famosas | sort --reverse

Resultado

Angelina Jolie (1975 -)
Amelia Earhart (1897 - 1937)
Alfred Hitchcock (1899 - 1980)
Albert Einstein (1879 - 1955)
Al Gore (1948 -)
Abraham Lincoln (1809 - 1865)

Alternativas

sort | tac

Outras opções de classificação

Existem vinte e duas outras opções de classificação. Seguem exemplos.

Verificação de classificação

Classificar tem uma opção que permite verificar se a entrada está classificada. Ele retorna após a primeira instância de uma linha não classificada. Se a entrada precisar ser classificada, mas provavelmente já estiver em ordem, usar a verificação de classificação é apropriado.

Opção

--Verifica

Uso

sort --check

Linha de comando

seq 10 | sort --random-sort | sort --check

Resultado

classificar: -: 3: desordem: 10

Linha de comando

seq 10 | sort --random-sort | sort | classificar - verificar

Resultado

(em branco)

Classificar saída

Classificar tem uma opção que permite que você especifique um arquivo para gravar em vez de usar a saída padrão ou o redirecionamento. Seu uso pode melhorar a compatibilidade entre ambientes de script.

Opção

--output = FILE

Uso

sort --output = FILE

Linha de comando

seq 10 | sort --random-sort --output = random-10

Resultado

(em branco)

Classificação terminada em nulo

Classificar tem uma opção que permite definir o delimitador de linha como nulo em vez de uma nova linha.

Opção

--terminada em zero

Uso

sort - terminado em zero

Linha de comando

seq 10 | tr '\ 012' '\ 000' | sort - terminado em zero - sortimento aleatório

Resultado

25346178910

Classificar estável

Classificar tem uma opção que permite desativar a comparação de último recurso. Como resultado, tempos de execução mais estáveis ​​podem ser alcançados no caso de entradas grandes o suficiente que podem fazer com que a classificação funcione instável.

Opção

--estábulo

Uso

sort --stable

Linha de comando

tempo seq 1000000 | sort --random-sort | sort --stable> / dev / null

Resultado

0m9 real.138s
usuário 0m9.Década de 201
sys 0m0.107s

Classificar tamanho do buffer

Classificar tem uma opção que permite definir a quantidade de memória usada como buffer durante a classificação. Pode ser usado para limitar o consumo de memória, classificando entradas maiores. O desempenho pode ser afetado.

Opção

--buffer-size = SIZE

Uso

sort --buffer-size = 64

Linha de comando

tempo seq 1000000 | sort -random-sort | sort -stable -buffer-size = 64> / dev / null

Resultado

0m21 real.685s
usuário 0m9.858s
sys 0m2.092s

Classificar única

Classificar tem uma opção que permite remover linhas duplicadas na saída de classificação

Opção

--único

Uso

sort --unique

Linha de comando

echo 1 2 2 4 5 | tr '\ 040' '\ 000' | sort - terminado em zero --unique

Resultado

1245

Alternativas

sort | uniq

Conclusão

Sortéum comando externo útil não apenas quando usado em combinação com outros comandos externos, mas também é útil quando usado com comandos sem nenhum método de ordenação embutido, como uma função definida pelo usuário ou scripts bash em geral.

O cursor pula ou se move aleatoriamente enquanto digita no Windows 10
Se você descobrir que o cursor do mouse pula ou se move por conta própria, de forma automática e aleatória ao digitar em um laptop ou computador com W...
Como reverter a direção de rolagem do Mouse e Touchpads no Windows 10
Mouse e Touchpads não apenas torna a computação mais fácil, mas mais eficiente e menos demorada. Não podemos imaginar uma vida sem esses dispositivos,...
Como alterar o ponteiro do mouse e tamanho do cursor, cor e esquema no Windows 10
O ponteiro do mouse e o cursor no Windows 10 são aspectos muito importantes do sistema operacional. Isso também pode ser dito para outros sistemas ope...