fbpx

Comandos Linux – Comando sort

Comando sort do Linux

comando de classificação

sort classifica o conteúdo de um arquivo de texto, linha por linha.

visão global

sort é um comando simples e muito útil que reorganiza as linhas em um arquivo de texto para que sejam ordenadas numericamente e alfabeticamente. Por padrão, as regras para classificação são:

  • As linhas que começam com um número aparecerão antes das linhas que começam com uma letra.
  • As linhas que começam com uma letra que aparece mais cedo no alfabeto aparecerão antes das linhas que começam com uma letra que aparece mais tarde no alfabeto.
  • As linhas que começam com uma letra minúscula aparecerão antes das linhas que começam com a mesma letra em maiúsculas.

As regras para classificação podem ser alteradas de acordo com as opções que você fornece ao comando de classificação ; estes estão listados abaixo.

Sintaxe

classifique [ OPÇÃO ] ... [ ARQUIVO ] ...
classificar [ OPÇÃO ] ... --files0-de = F

Opções

-b , –ignore-líderes-em brancoIgnore os espaços em branco à esquerda.
-d , – ordem do dicionárioConsidere apenas espaços em branco e caracteres alfanuméricos .
-f , –ignore-caseDobre letras minúsculas para caracteres maiúsculos.
-g , –geral-numérica geralCompare de acordo com o valor numérico geral.
-i , –ignore-nonprintingConsidere apenas caracteres imprimíveis.
-M , –month-sortCompare (desconhecido) <` JAN ‘<… <` DEC ‘.
-h , –human-numeric-sortCompare números legíveis por humanos (por exemplo, ” 2K “, ” 1G “).
-n , –numeric-sortCompare de acordo com o valor numérico da string .
-R , – tipo aleatórioClassifique por hash aleatório de chaves.
–random-source = ARQUIVOObter bytes aleatórios de FILE .
-r , –reverseInverta o resultado das comparações.
–sort = PALAVRAClassifique de acordo com WORD : numérico geral -g , numérico humano -h , mês -M , numérico -n , aleatório -R , versão -V .
-V , –version-sortTipo natural de (versão) números dentro do texto.

Outras opções

–batch-size = NMERGEMesclar na maioria das entradas NMERGE de uma só vez; para mais use arquivos temporários.
-c , –check , –check = primeiro diagnosticarVerifique se há entrada classificada; não classifique.
-C , –check = silencioso , –check = silenciosoComo -c , mas não reporte a primeira linha incorreta.
–compress-program = PROGComprimir temporários com PROG ; descompacte-os com PROG -d .
–depurarAnote a parte da linha usada para classificar e avise sobre o uso questionável ao stderr.
–files0-de = FLeia a entrada dos arquivos especificados por nomes terminados por NUL no arquivo F ; Se F for ‘-‘, leia os nomes da entrada padrão.
-k , –key = POS1 [, POS2 ]Inicie uma chave no POS1 (origem 1) e termine no POS2 (final de linha padrão). Veja a sintaxe do POS abaixo.
-m , –mergeMesclar arquivos já classificados; não classifique.
-o , –output = ARQUIVOEscreva o resultado em FILE em vez da saída padrão.
-s , –stableEstabilize a classificação desativando a comparação de último recurso.
-t , – separador de campos = SEPUse o SEP em vez da transição não-em branco para em branco.
-T , – diretório temporário = DIRUse DIR para temporários, não $ TMPDIR ou / tmp ; várias opções especificam vários diretórios.
–parallel = NAlterar o número de tipos executadas simultaneamente para N .
-u , –uniqueCom -c , verifique se há pedidos estritos; sem -c , produz apenas o primeiro de uma execução igual.
-z , –zero-terminadoLinhas finais com 0 byte, não nova linha.
–SocorroExiba uma mensagem de ajuda e saia.
–versãoExiba informações da versão e saia.

O POS assume a forma F [ C ] [ OPTS ], onde F é o número do campo e C a posição do caractere no campo; ambos são de origem 1 . Se nem -t nem -b estiver em vigor, os caracteres em um campo serão contados desde o início do espaço em branco anterior. OPTS é uma ou mais opções de pedido de uma letra, que substituem as opções globais de pedido dessa chave. Se nenhuma tecla for fornecida, use a linha inteira como chave.

SIZE pode ser seguido pelos seguintes sufixos multiplicativos:

%1% de memória
b1
K1024 (padrão)

… e assim por diante para M , L , T , P , E , Z , Y .

Sem FILE , ou quando FILE é um hífen (”  “), a classificação lê da entrada padrão .

Além disso, observe que o código do idioma especificado pelo ambiente afeta a ordem de classificação; defina LC_ALL = C para obter a ordem de classificação tradicional que usa valores de bytes nativos.

Exemplos

Digamos que você tenha um arquivo, data.txt , que contém o seguinte texto ASCII :

maçãs
laranjas
peras
kiwis
bananas

Para classificar as linhas neste arquivo em ordem alfabética, use o seguinte comando:

classificar data.txt

… que produzirá a seguinte saída:

maçãs
bananas
kiwis
laranjas
peras

Observe que esse comando não altera realmente o arquivo de entrada, data.txt . Se você deseja gravar a saída em um novo arquivo, output.txt , redirecione a saída da seguinte maneira:

classificar dados.txt> saída.txt

… que não exibirá nenhuma saída, mas criará o arquivo output.txt com os mesmos dados classificados do comando anterior. Para verificar a saída, use o comando cat :

cat output.txt

… que exibe os dados classificados:

maçãs
bananas
kiwis
laranjas
peras

Você também pode usar a opção de classificação interna -o , que permite especificar um arquivo de saída:

ordenar -o output.txt data.txt

Usar a opção -o é funcionalmente o mesmo que redirecionar a saída para um arquivo; nenhum deles tem vantagem sobre o outro.

Classificação em ordem inversa

Você pode executar uma classificação de ordem inversa usando o sinalizador -r . Por exemplo, o seguinte comando:

sort -r data.txt

… produzirá a seguinte saída:

peras
laranjas
kiwis
bananas
maçãs

Manipulando Dados de Casos Mistos

Mas e as situações em que você tem uma mistura de letras maiúsculas e minúsculas no início de suas linhas? Em casos como esse, o comportamento da classificação pode parecer confuso, mas na verdade só precisa de mais algumas informações suas para classificar os dados da maneira que desejar. Vamos olhar mais de perto.

Digamos que nosso arquivo de entrada data.txt contenha os seguintes dados:

uma
b
UMA
B
b
c
D
d
C

classificando esses dados sem nenhuma opção, como esta:

classificar data.txt

… produzirá a seguinte saída:

uma
UMA
b
b
B
c
C
d
D

Como você pode ver, é classificada em ordem alfabética, com letras minúsculas sempre aparecendo antes das letras maiúsculas. Essa classificação não diferencia maiúsculas de minúsculas e é o padrão para a classificação GNU , que é a versão da classificação usada no GNU / Linux.

Nesse ponto, você deve estar se perguntando, bem, se a classificação sem distinção entre maiúsculas e minúsculas é o padrão, qual é a opção ” -f / –ignore-case “? A resposta tem a ver com configurações de localização e classificação bytewise.

Em resumo, “localização” refere-se ao idioma que o sistema operacional usa, que no nível mais básico define quais caracteres ele usa. Cada letra no sistema é representada em uma determinada ordem. A alteração das configurações de localidade afetará os caracteres que o sistema operacional está usando e – o mais relevante para a classificação – em que ordem eles são codificados. Para um exemplo, consulte a tabela de codificação ASCII em inglês dos Estados Unidos . Como você pode ver na tabela, uma capital A ( ” A ‘) é o número de caracteres 65 e minúsculas um (‘ a “) é o número de caracteres 97. Então você poderia esperar tipo para organizar sua saída de modo que as letras maiúsculas vêm antes minúsculas cartas.

Defining operating system locale is a subject which goes beyond the scope of this document, but for now, it will suffice to say that to achieve bytewise sorting, we need to set the environment variable LC_ALL to C.

Under the default Linux shell, bash, we can accomplish this with the following command:

export LC_ALL=C

This sets the environment variable LC_ALL to the value C, which will enforce bytewise sorting. Now if we run the command:

sort data.txt

…we will see the following output:

A
B
C
D
a
b
b
c
d

…and now, the -f/–ignore-case option has the following effect:

A
a
B
b
b
C
c
D
d

… executando uma classificação “bytewise que não diferencia maiúsculas de minúsculas”.

Notase você estiver usando o comando join em conjunto com a classificação , esteja ciente de que há uma incompatibilidade conhecida entre os dois programas – a menos que você defina o código do idioma. Se você estiver usando junção e classificação para processar a mesma entrada, é altamente recomendável que você defina LC_ALL como C , o que padronizará a localização usada por todos os programas.

Verificando a ordem classificada

Se você quiser apenas verificar se o seu arquivo de entrada já está classificado, use a opção -c :

classifique -c data.txt

Se seus dados não estiverem classificados, você receberá uma mensagem informativa informando o número da linha dos primeiros dados não classificados e quais são os dados não classificados:

sort: data.txt: 3: desordem: A

Classificando vários arquivos usando a saída do find

Uma maneira útil de classificar dados é classificar a entrada de vários arquivos, usando a saída do comando find . A maneira mais confiável (e responsável) de fazer isso é especificar que find produz uma lista de arquivos terminada em NUL como saída e canalizar essa saída em classificação usando a opção –files0-from .

Normalmente, localize produz um arquivo em cada linha; em outras palavras, ele insere uma quebra de linha após cada nome de arquivo gerado. Por exemplo, digamos que temos três arquivos denominados data1.txt , data2.txt e data3.txt . O find pode gerar uma lista desses arquivos usando o seguinte comando:

find -name "data? .txt"

Este comando usa o curinga do ponto de interrogação para corresponder a qualquer arquivo que tenha um único caractere após a palavra “data” em seu nome, terminando na extensão ” .txt “. Produz a seguinte saída:

./data1.txt
./data3.txt
./data2.txt

Seria bom se pudéssemos usar essa saída para informar o comando de classificação , “classifique os dados nos arquivos encontrados por find como se fossem todos um arquivo grande”. O problema com a saída de localização padrão é que, embora seja fácil para os humanos lerem, isso pode causar problemas para outros programas que precisam ler. Como os nomes dos arquivos podem incluir caracteres não-padrão, em alguns casos, esse formato será alterado. ser lido incorretamente por outro programa.

A maneira correta de formatar a saída do find a ser usada como uma lista de arquivos para outro programa é usar a opção -print0 ao executar o find . Isso termina cada nome de arquivo com o caractere NUL (número de caractere ASCII zero), que é universalmente ilegal para uso em nomes de arquivos. Isso facilita as coisas para o programa que está lendo a lista de arquivos, pois sabe que sempre que vê o caractere NUL, pode ter certeza de que está no final do nome do arquivo.

Portanto, se executarmos o comando anterior com a opção -print0 no final, assim:

find -name "data? .txt" -print0

… produzirá a seguinte saída:

./data1.txt./data3.txt./data2.txt

Você não pode vê-lo, mas após cada nome de arquivo é um caractere NUL. Esse caractere não é imprimível e, portanto, não aparecerá na tela, mas está lá, e qualquer programa para o qual você canalizar essa saída ( classificação , por exemplo) os verá.

NotaTenha cuidado com a palavra do comando find . É importante especificar -print0 last; find precisa que isso seja especificado após as outras opções.

Ok, mas como dizemos ao sort para ler esta lista de arquivos e ao conteúdo de todos esses arquivos?

Uma maneira de fazer isso é canalizar a saída find para classificar , especificando a opção –files0-from no comando sort e especificar o arquivo como um hífen (”  “), que será lido na entrada padrão. Aqui está a aparência do comando:

find -name "data? .txt" -print0 | ordenar --arquivos0-de = -

… e ele produzirá os dados classificados de qualquer arquivo localizado por find que corresponda aos dados do padrão ? .txt , como se fossem todos um arquivo . Este exemplo é uma função muito poderosa de classificação – experimente.

Comparando apenas campos de dados selecionados

Normalmente, a ordenação decide como classificar as linhas com base em toda a linha: compara todos os caracteres desde o primeiro caractere em uma linha até o último.

Se, por outro lado, você deseja classificar para comparar um subconjunto limitado de seus dados, você pode especificar quais campos comparar usando a opção -k .

Por exemplo, se você tiver um arquivo de entrada data.txt Com os seguintes dados:

01 Joe
02 Marie
03 Albert
04 Dave

… e você a classifica sem opções, assim:

classificar data.txt

… você receberá a seguinte saída:

01 Joe
02 Marie
03 Albert
04 Dave

… como você pode ver, nada foi alterado na ordem dos dados originais, devido aos números no início da linha – que já foram classificados. No entanto, se você deseja classificar com base nos nomes, pode usar o seguinte comando:

ordenar -k 2,2 data.txt

Este comando classificará o segundo campo e ignorará o primeiro. (O “k” em ” -k ” significa “chave” – ​​estamos definindo a “chave de classificação” usada na comparação.)

Campos são definidos como qualquer coisa separada por espaço em branco ; nesse caso, um caractere de espaço real. Nosso comando acima produzirá a seguinte saída:

03 Albert
04 Dave
01 Joe
02 Marie

… que é classificado pelo segundo campo, listando as linhas em ordem alfabética por nome e ignorando os números no processo de classificação.

Você também pode especificar uma opção -k mais complexa . O argumento posicional completo é assim:

-k  POS1 , POS2

… onde POS1 é a posição do campo inicial e POS2 é a posição do campo final. Cada posição do campo, por sua vez, é definida como:

F . C

… onde F é o número do campo e C é o caractere dentro desse campo para iniciar a comparação de classificação.

Então, digamos que nosso arquivo de entrada data.txt contenha os seguintes dados:

01 Joe Sr.Designer
02 Marie Jr.Developer
03 Albert Jr.Designer
04 Dave Sr.Developer

… podemos classificar por antiguidade se especificarmos o terceiro campo como a chave de classificação:

classifique -k 3 data.txt

… isso produz a seguinte saída:

03 Albert Jr.Designer
02 Marie Jr.Developer
01 Joe Sr.Designer
04 Dave Sr.Developer

Ou podemos ignorar os três primeiros caracteres do terceiro campo e classificar apenas com base no título, ignorando a antiguidade:

ordenar -k 3.3 data.txt
01 Joe Sr.Designer
03 Albert Jr.Designer
02 Marie Jr.Developer
04 Dave Sr.Developer

Também podemos especificar onde na linha parar de comparar. Se classificarmos com base apenas nos caracteres de terceiro a quinto do terceiro campo de cada linha, assim:

ordenar -k 3.3,3.5 data.txt

… sort verá apenas a mesma coisa em todas as linhas: ” .De ” … e nada mais . Como resultado, a classificação não verá diferenças nas linhas e a saída classificada será igual ao arquivo original:

01 Joe Sr.Designer
02 Marie Jr.Developer
03 Albert Jr.Designer
04 Dave Sr.Developer

Usando classificação E junte-se

A classificação pode ser especialmente útil quando usada em conjunto com o comando join . Normalmente, a junção juntará as linhas de dois arquivos cujo primeiro campo corresponda. Digamos que você tenha dois arquivos, file1.txt e file2.txt . file1.txt contém o seguinte texto:

3 tomate
1 cebola
4 beterraba
2 pimenta

… e file2.txt contém o seguinte:

4 laranja
3 maçã
1 manga
2 toranjas

Se você quiser classificar esses dois arquivos e se juntar a eles, poderá fazê-lo em um único comando se estiver usando o shell de comando bash , assim:

junção <(classificar arquivo1.txt) <(classificar arquivo2.txt)

Aqui, os comandos de classificação entre parênteses são executados e sua saída é redirecionada para junção , o que leva sua saída como entrada padrão para seus primeiro e segundo argumentos; está juntando o conteúdo classificado dos dois arquivos e fornece resultados semelhantes aos resultados abaixo.

1 manga de cebola
2 pimentos de toranja
3 tomate maçã
4 beterraba laranja

comm – Compare dois arquivos classificados linha por linha.
join – Une as linhas de dois arquivos que compartilham um campo de dados comum.
uniq – identifique e opcionalmente filtre linhas repetidas em um arquivo.

22 de novembro de 2019

Sobre nós

A Linux Force Brasil é uma empresa que ama a arte de ensinar. Nossa missão é criar talentos para a área de tecnologia e atender com excelência nossos clientes.

CNPJ: 13.299.207/0001-50
SAC:         0800 721 7901

Comercial  Comercial: (11) 3796-5900

Suporte:    (11) 3796-5900

Copyright © Linux Force Security  - Desde 2011.