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 | ordenarResultado
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 -nResultado
9697
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 -hResultado
9697
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 -gResultado
9697
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 -gResultado
9697
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 -hResultado
9697
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-sortResultado
9596
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 <
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-sortResultado
MarOut
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-sortResultado
JanFev
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.idiotaalias 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 ipsResultado
199.174.177.98180.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 ipsResultado
76.88.194.1578.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éricaordem 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.gzk-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 golesResultado
d-v127.100.108.192.alcatrão.gze-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 brancoUso
sort --ignore-lead-blanksComandos
pessoas famosas> fpcat >> 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> fpcat >> 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 | tacObserve 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 casoUso
sort --ignore-caseComandos
pessoas famosas> fpcat >> 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> fpcat >> 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 | tacObserve 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ívelUso
sort --ignore-nonprintingComandos
pessoas famosas> fpecho -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> fpecho -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> fpecho -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 --reverseLinha de comando
pessoas famosas | sort --reverseResultado
Angelina Jolie (1975 -)Amelia Earhart (1897 - 1937)
Alfred Hitchcock (1899 - 1980)
Albert Einstein (1879 - 1955)
Al Gore (1948 -)
Abraham Lincoln (1809 - 1865)
Alternativas
sort | tacOutras 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
--VerificaUso
sort --checkLinha de comando
seq 10 | sort --random-sort | sort --checkResultado
classificar: -: 3: desordem: 10Linha de comando
seq 10 | sort --random-sort | sort | classificar - verificarResultado
(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 = FILEUso
sort --output = FILELinha de comando
seq 10 | sort --random-sort --output = random-10Resultado
(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 zeroUso
sort - terminado em zeroLinha de comando
seq 10 | tr '\ 012' '\ 000' | sort - terminado em zero - sortimento aleatórioResultado
25346178910Classificar 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ábuloUso
sort --stableLinha de comando
tempo seq 1000000 | sort --random-sort | sort --stable> / dev / nullResultado
0m9 real.138susuá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 = SIZEUso
sort --buffer-size = 64Linha de comando
tempo seq 1000000 | sort -random-sort | sort -stable -buffer-size = 64> / dev / null
Resultado
0m21 real.685susuá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
--únicoUso
sort --uniqueLinha de comando echo 1 2 2 4 5 | tr '\ 040' '\ 000' | sort - terminado em zero --unique
Resultado
1245Alternativas
sort | uniqConclusã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.