Estou enfrentando um enorme arquivo de 4 colunas. Gostaria de exibir o arquivo classificado no stdout com base em sua terceira coluna:
cat myFile | sort -u -k3
Isso é suficiente para executar o truque?
sort -u -k3 myFile
, até mesmo
Estou enfrentando um enorme arquivo de 4 colunas. Gostaria de exibir o arquivo classificado no stdout com base em sua terceira coluna:
cat myFile | sort -u -k3
Isso é suficiente para executar o truque?
sort -u -k3 myFile
, até mesmo
Respostas:
sort -k 3,3 myFile
exibiria o ficheiro classificados pelo 3 rd coluna assumindo que as colunas são separadas por sequências de espaços em branco (SPC caracteres ASCII e guia na localidade POSIX / C), de acordo com a ordem de classificação definido pela localidade actual.
Observe que os espaços em branco à esquerda estão incluídos na coluna (o separador padrão é a transição de um não em branco para um em branco), que pode fazer a diferença em locais onde os espaços não são ignorados para fins de comparação, use a -b
opção para ignorar os espaços em branco principais.
Observe que é completamente independente do shell (todos os shells analisariam a mesma linha de comando, os shells geralmente não têm o sort
comando incorporado).
-k 3
é classificar na porção das linhas começando com o 3 rd coluna (incluindo os espaços em branco à esquerda). No código de idioma C, porque os caracteres de espaço e tab são classificados antes de todos os caracteres imprimíveis, que geralmente fornecem o mesmo resultado que -k 3,3
(exceto linhas que possuem um terceiro campo idêntico),
-u
é reter apenas uma das linhas se houver várias que sejam classificadas de forma idêntica (é aí que a chave de classificação será igual (não é necessariamente o mesmo que ser igual )).
cat
é o comando para con gato enate. Você não precisa aqui.
Se as colunas forem separadas por outra coisa, você precisará da -t
opção para especificar o separador.
Arquivo de exemplo fornecido 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 classificação é da terceira coluna até o final da linha, portanto, -u
mantém as duas. ␠ca␠d
classifica antes ␠c␠c
porque os espaços são ignorados na primeira passagem no meu código do idioma, cad
classifica antes 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 terceira coluna está ␠c
. Observe como aquele com ␠␠c
(2 espaços à esquerda) é mantido.
$ 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 a b c d
e a c c c
é invertida. No primeiro caso, porque ␠c␠c
classifica antes ␠c␠d
, no segundo caso, porque a chave de classificação é a mesma ( ␠c
), a comparação de último recurso que compara as linhas em colocações completas a b c d
antes a 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
Depois que ignoramos os espaços em branco, a chave de classificação para as 3 primeiras linhas é a mesma ( c
), portanto, elas são classificadas pela comparação do ú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 código de idioma C, ␠␠c
classifica antes, ␠c
pois há apenas uma passagem para lá, onde os caracteres (bytes únicos) são classificados com base no valor do ponto de código (onde o espaço tem um ponto de código menor que c
).
blank
separadas, que podem incluir outros caracteres, além de espaço e tabulação, dependendo da localidade.
3,3
faz? Por que não apenas 3
?
Se você entende "coluna" como no arquivo de texto (quarto caractere), então sim, sua solução deve funcionar (ou até mesmo sort -u -k3 myFile
para permitir sort
executar algumas mágicas de economia de memória com acesso aleatório). Se você entende "coluna" como no banco de dados - toda uma entidade de dados seguida por um separador e largura variável da coluna, precisará de algo mais sofisticado, por exemplo, isso classifica ls -l por tamanho
ls -l |awk '{print $5 " " $0;}'| sort -n | cut -d " " -f 2-
(que é equivalente a trivial, ls -lS
mas serve bem ao exemplo.)
sort -k 1.3,1.3
. ls -l | sort -k5,5n
para classificar no tamanho.
awk
solução é exatamente o que eu needed-- facilmente modificado para se adequar às exigências de classificação complexo
sort -g -k column_number
é o comando certo para classificar qualquer lista com caracteres numéricos usando coluna específica
Você pode usar a biblioteca awk Velour :
#!/usr/local/bin/velour -f
{
q[NR] = $3
z[NR] = $0
}
END {
a_sort_by(q, z)
io_puts(q)
}
$ sort -k 1.3,1.3 myfile
Classificará seu arquivo myfile na terceira coluna se o seu arquivo não tiver nenhum separador.
$ cat myfile
ax5aa
aa3ya
fg7ds
pp0dd
aa1bb
$ sort -k 1.3,1.3 myfile
pp0dd
aa1bb
aa3ya
ax5aa
fg7ds
página de manual do tipo:
[...] -k, --key = POS1 [, POS2] inicia uma chave no POS1 (origem 1), termina-a no POS2 (final da linha padrão) [...] POS é 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.
Com --key = 1.3,1.3, você disse que havia apenas um campo (a linha inteira) e que estava comparando a posição do terceiro caractere desse campo.
sort -u -k3 < myFile
.