Classificando o arquivo pela primeira e pela segunda coluna

13

Como posso manipular um arquivo de texto separado por tabulação de duas colunas, classificando pelo primeiro elemento da segunda coluna (somente se o primeiro elemento da coluna for o mesmo)?

Exemplo:

Arquivo de entrada 1

A   1-2
A   6-8
A   3-4
B   7-10
B   5-9

Saída esperada: Arquivo 2

A   1-2
A   3-4
A   6-8
B   5-9
B   7-10
dovah
fonte

Respostas:

22

Use sorta -kopção para classificar por (várias) colunas de uma vez:

$ sort -k1,1 -k2n input
A   1-2
A   3-4
A   6-8
B   5-9
B   7-10

-k1,1classifica pela primeira coluna primeiro e depois -k2npela segunda¹ numericamente quando a primeira coluna foi ligada, para que você obtenha sua saída na ordem que deseja: classificando pelo primeiro elemento da segunda coluna, somente se o primeiro elemento da coluna for o mesmo.

Ao classificar numericamente, ele examinará o campo apenas até que ele pare de ser um número, de modo que você faça uma comparação apenas do primeiro elemento dele.

Quando as duas chaves comparam o mesmo, sortcompara as linhas completas lexicamente como uma comparação de último recurso. Por exemplo, em A 1-10vs A 1-2, as primeiras chaves são idênticas ( Astring) e a segunda chave também (ambas são tratadas como o número 1); portanto, sortcompara A 1-10vsA 1-2 lexicamente e a última é maior conforme as 2sortes seguintes 1. A implementação do GNU de sorttem uma -Vopção ou Vsinalizador de chave para executar uma classificação de versão , que é como uma comparação lexical, exceto que as seqüências de dígitos decimais nas seqüências de caracteres são comparadas numericamente, então sort -k1,1 -k2Vseria ordenada A 1-10depois A 1-2porque o 10número é maior que 2.


¹ tecnicamente, -k2significa a parte da linha que começa com o segundo campo (após a primeira transição de um não-espaço em branco para um espaço em branco) e termina no final da linha, mas com o nsinalizador é equivalente a -k2,2napenas a parte principal que constitui um número é considerado.

Michael Homer
fonte