I'm frente a um enorme arquivo de 4 colunas. I'gostaria de exibir o arquivo ordenado em stdout baseado em sua 3ª coluna:
cat myFile | sort -u -k3
Isso é suficiente para executar o truque?
sort -k 3,3 myFile
exibiria o arquivo ordenado pelo 3rd coluna assumindo que as colunas estão separadas por seqüências de espaços em branco (caracteres ASCII SPC e TAB no locale POSIX/C), de acordo com a ordem de ordenação definida pelo locale atual.
Note que os espaços em branco iniciais estão incluídos na coluna (o separador padrão é a transição de um não-blank para um blank), que pode fazer a diferença em locais onde os espaços não são ignorados para fins de comparação, utilize a opção `-b' para ignorar os espaços em branco iniciais.
Note que ele'é completamente independente da shell (todas as shells analisariam essa linha de comando da mesma forma, as shells geralmente não'não têm o comando sort
embutido).
O -k 3
é para classificar na porção das linhas que começam com a coluna 3rd (incluindo os espaços em branco). No local C, porque os caracteres de espaço e tabulação estão antes de todos os caracteres imprimíveis, o que geralmente lhe dará o mesmo resultado que -k 3,3
(exceto para as linhas que têm um terceiro campo idêntico),
O `-u' é reter apenas uma das linhas se houver várias que ordenem de forma idêntica (é onde a chave de ordenação ordena o mesmo (isso's não é necessariamente o mesmo que ser igual)).
O cat
é o comando para concatenate. Você não'não precisa dele aqui.
Se as colunas estiverem separadas por outra coisa, você precisa da opção `-t' para especificar o separador.
Dado o arquivo de exemplo a
$ cat a
a c c c
a b ca d
a b c e
a b c d
Com -u -k 3
:
$ echo $LANG
en_GB.UTF-8
$ sort -u -k 3 a
a b ca d
a c c c
a b c d
a b c e
As linhas 2 e 3 têm a mesma terceira coluna, mas aqui a chave de ordenação é da terceira coluna até o final da linha, portanto -u' retém ambas. O
␠ca␠d' ordena antes do ␠c␠c' porque os espaços são ignorados na primeira passagem no meu locale, o
cad' ordena antes do `cc'.
$ sort -u -k 3,3 a
a b c d
a b c e
a b ca d
Acima apenas um é retido para aqueles onde a 3ª coluna é ␠c'. Observe como a que tem
␠␠c` (2 espaços principais) é retida.
$ sort -k 3 a
a b ca d
a c c c
a b c d
a b c e
$ sort -k 3,3 a
a b c d
a c c c
a b c e
a b ca d
Veja como a ordem de a b c d
e a c c c
são invertidas. No primeiro caso, porque ␠c␠c' ordena antes de
␠c␠d', no segundo caso, porque a chave de ordenação é a mesma (␠c'), a comparação de último recurso que compara as linhas por completo coloca
a b c d' antes de `a c c c c''.
$ sort -b -k 3,3 a
a b c d
a b c e
a c c c
a b ca d
Uma vez que ignoramos os espaços em branco, a chave de ordenação para as 3 primeiras linhas é a mesma (c
), por isso são ordenadas pela comparação de último recurso.
$ LC_ALL=C sort -k 3 a
a b c e
a c c c
a b c d
a b ca d
$ LC_ALL=C sort -k 3,3 a
a b c e
a b c d
a c c c
a b ca d
No local C, ␠␠c' ordena antes de
␠c', pois só há uma passagem onde os caracteres (depois bytes únicos) ordenam com base no seu valor de ponto de código (onde o espaço tem um ponto de código inferior a `c').
Se você entende "column" como em arquivo texto (4º caracter) então sim, sua solução deve funcionar (ou mesmo sort -u -k3 myFile
para permitir `sort' executar algumas magias que economizam memória com acesso aleatório). Se você entende "column" como em banco de dados - uma entidade inteira de dados seguida por um separador, e largura de coluna variável, você'vai precisar de algo mais sofisticado e.g. isto ordena ls -l por tamanho
ls -l |awk '{print $5 " " $0;}'| sort -n | cut -d " " -f 2-
(o que é equivalente ao trivial ls -lS
mas serve o exemplo bem).
sort -g -k column_number
é o comando certo para ordenar qualquer lista com caracteres numéricos usando uma coluna específica