Estou usando a classificação unix para classificar um arquivo delimitado por vírgula com várias colunas. Até agora, isso funcionou perfeitamente para classificar os dados numericamente ou em ordem alfabética:
Arquivo de exemplo antes de qualquer classificação:
C,United States,WA,Tacoma,f,1
A,United States,MA,Boston,f,0
B,United States,NY,New York,f,5
A,Canada,QC,Montreal,f,2
A,Bahamas,Bahamas,Nassau,f,2
A,United States,NY,New York,f,1
Classifique o arquivo: $ sort -t ',' -k 2,2 -k 3,3 -k 4,4 -k 5,5r -k 6,6nr tmp.csv
Resultado classificado:
A,Bahamas,Bahamas,Nassau,f,2
A,Canada,QC,Montreal,f,2
A,United States,MA,Boston,f,0
B,United States,NY,New York,f,5
A,United States,NY,New York,f,1
C,United States,WA,Tacoma,f,1
Aqui está o problema: desejo classificar a coluna 2 com base em uma classificação personalizada, o que significa que quero primeiro os Estados Unidos, depois o Canadá e as Bahamas:
Classificação desejada:
A,United States,MA,Boston,f,0
B,United States,NY,New York,f,5
A,United States,NY,New York,f,1
C,United States,WA,Tacoma,f,1
A,Canada,QC,Montreal,f,2
A,Bahamas,Bahamas,Nassau,f,2
Existe alguma maneira de passar à ordem do unix uma ordem de classificação personalizada que pode ser aplicada? Algo como:
$ sort -t ',' -k 2,2:'United States, Canada, Bahamas' -k 3,3 -k 4,4 -k 5,5r -k 6,6nr tmp.csv
Obrigado!
join
comando, mas você pode acabar com muita classificação - os arquivos de entradajoin
devem ser classificados em uma ordem e, em seguida, você estaria usandosort
novamente para colocar os dados em uma ordem diferente (e perder a coluna da ordem de classificação como uma etapa de pós-classificação).t
vez daf
última linha?Respostas:
A outra resposta e comentário respondem à pergunta em geral, eis como uma implementação pode parecer:
fonte
sed
não era realmente necessário aqui.Você não pode fazer isso com classificação . Neste ponto, você realmente deve procurar o awk / perl / seu-idioma-preferido . Você pode fingir, no entanto. Você pode, por exemplo, usar sed para alterar "Estados Unidos" para 0, "Canadá" para 1 e "Bahamas" para 2 e, em seguida, fazer uma classificação numérica nessa coluna e sedá-la novamente. Ou altere "Estados Unidos" para "Estados Unidos, 0" etc., classifique na coluna extra e depois a descarte.
fonte
Acabei de escrever um auxiliar chamado csort para facilitar isso. Ele prefixa cada linha com um valor de sua escolha, com base na correspondência de substring ou expressão regular na linha:
A
2=STR
notação significa "corresponder se o segundo campo for igualSTR
".Você pode opcionalmente canalizar a saída
cut -c3-
para remover o prefixo.fonte