Tenho um arquivo csv e gostaria de classificá-lo por prioridade de coluna, como "ordenar por". Por exemplo:
3;1;2
1;3;2
1;2;3
2;3;1
2;1;3
3;2;1
Se esta situação fosse o resultado de uma "seleção", o "ordenar por" seria o seguinte: ordenar por coluna2, coluna1, coluna3 - o resultado seria:
2;1;3
3;1;2
1;2;3
3;2;1
1;3;2
2;3;1
Eu gostaria de saber como obter este mesmo resultado usando o comando "sort" no Unix.
unix
sorting
csv
sql-order-by
Rafael Orágio
fonte
fonte
Respostas:
fonte
-n
opção que irá "comparar de acordo com o valor numérico da string" ou a-g
opção que irá "comparar de acordo com o valor numérico geral". Uma comparação de string de valores numéricos obterá os números ordenados da mesma forma1,10,2,20
. Pelo menos essas são opções disponíveis na minha versão do tipo no CentOS. Você deve verificar na página do manual quais são as opções corretas em sua versão de classificação.sort: stray character in field spec: invalid field specification ‘2,1,3’
sort --field-separator=',' -r -k3 -k1 -k2 source.csv > target.csv
funcionou para mim.sort --field-separator=';' --key={2,1,3}
. FuncionouGNU coreutils 8.4
desde abril de 2016--key={2,1,3}
usa expansão de chave de bashSuponha que você tenha outra linha
3;10;3
em seuunsorted.csv
arquivo. Então eu acho que você espera um resultado classificado numericamente:e não em ordem alfabética:
Para conseguir isso, você deve usar
-n
:Vale ressaltar que
2,2
tem que ser usado. Se2
for usado,sort
leva a string do início do campo 2 ao final.2,2
garante que apenas o campo2
seja usado.fonte
3;10;3
,3:10:5
,3:10;2
,3;10;3
nessa ordem no arquivo de origem, e quando se utiliza apenas-k 2,2
parece classificar coluna 2 e 3. A página homem diz"The -k option may be specified multiple times, in which case subsequent keys are compared when earlier keys compare equal."
. No meu caso, a chave anterior (valor = 10) comparou igual, no entanto, não especifiquei-k
várias vezes. Não tenho certeza se esse é um comportamento confiável ou relacionado ao meu sistema (mac). Em última análise, não importa, contanto que a classificação primária seja correta.-s
um tipo estável que ignora as chaves iguais, que aparentemente é mais rápido de acordo com o homem.A resposta de Charlie acima não funcionou para mim no Cygwin (classificar versão 2.0, GNU textutils), o seguinte funcionou:
fonte
sort --field-separator=';' -k2 -k1 -k3 test.csv
..e se alguém seguiu a solução de 'classificação', mas agora deseja obter mais do que uma única entrada única por linha (ou seja, o número X principal de entradas exclusivas), uma vez que você classificou o arquivo usando 'classificar', você pode usar um pequeno aplicativo que criei aqui:
https://github.com/danieliversen/MiscStuff/blob/master/scripts/findTopUniques.java
fonte
cat unsorted-file | sort | uniq | head -X
- quandoX
é o número de primeiras linhas que deseja imprimir.uniq
na ordem dos tubos, entre osort
e ohead
, que confere exclusividade a todas as linhas classificadas imediatamente antes da extração das linhas superiores.