Eu não posso fazer isso com o único sort
. Pode não ser possível.
Na minha solução awk
manipula a primeira coluna e executa sort
quantas vezes forem necessárias. O script recebe entrada de stdin, imprime para stdout).
#!/usr/bin/awk -f
BEGIN { command = "sort -k 2,2g" }
{
if ( NR==1 ) {
val=$1
buf=$0
}
else
if ( $1 < val ) {
print "Unsorted 1st column detected. Processing last valid chunk and aborting." > "/dev/stderr"
exit 1
}
else {
if ( $1 == val )
buf=buf"\n"$0
else
{
print buf | command
close(command)
buf=$0
val=$1
}
}
}
END { print buf | command }
Notas:
-
close(command)
é crucial. Sem ele, todos os canais paracommand
iriam para um singlesort
. - Na minha opinião, os operadores de comparação
awk
lidam com números muito bem. Para ter certeza de que a solução funciona da mesma forma que osort
funcionaria, você precisa recuperar o status de saída desort -c -k 1,1g
paraval"\n"$1
e separadamente para$1"\n"val
e, em seguida, criar a lógica de script nessa . Isso executaria doissort
processos por linha de entrada, espero um grande desempenho.