(Eu gosto da colar / cortar resposta do @taliezin. Aqui está uma solução mais prosaica no caso de muitos colunas).
Dividir os dados em um arquivo por coluna, classificar esses arquivos e mesclar o
arquivos. Estou assumindo colunas de largura fixa de 1 caractere, para lidar com
a coluna 2 é mais curta que a coluna 3, por exemplo.
Nesta demonstração data0
é o arquivo inicial:
for i in {1..4}
do awk -v i=$i '{ch = substr($0,i*2-1,1);if(ch!=" ")print ch}' </tmp/data0 |
sort -u >/tmp/data$i
done
awk -v rows=$(wc -l </tmp/data0) '
BEGIN{
for(i=1;i<=4;i++)
file[i] = "/tmp/data" i
while(rows-->0){
for(i=1;i<=4;i++){
d = ""
getline d <file[i]
printf("%1s ",d)
}
printf "\n"
}
}' </dev/null