Classificando mais de uma coluna

3

Eu tenho um arquivo com conteúdo semelhante a este:

19.58 1925 Alpha
20.40 1924 Otter
13.66 1920 Gold

Estou tentando classificá-lo "coluna por coluna" para gerar o seguinte:

13.40 1920 Alpha
19.58 1924 Gold
20.66 1925 Otter

Eu tentei várias combinações de código, por exemplo:

cat files | sort -t. -k1,1n | sort -t " " -k2,2n -k3,3r k4,4n

mas isso não gera o resultado desejado. Como eu poderia conseguir a classificação que mencionei?

    
por trolkura 20.11.2015 / 00:47

3 respostas

3
printf "%s.%s %s %s\n" $(paste <(awk -F'[. ]' '{print $1}' file | sort -n) <(awk -F'[. ]' '{print $2}' file | sort -n) <(awk -F'[. ]' '{print $3}' file | sort -n) <(awk -F'[. ]' '{print $4}' file | sort))

Saída:

13.40 1920 Alpha
19.58 1924 Gold
20.66 1925 Otter
    
por 20.11.2015 / 00:56
1

Se você tem o GNU awk , então a classificação pode ser feita com uma pequena ajuda da matriz especial PROCINFO :

awk -F '[. ]' '{for(i=1;i<NF+1;i++) a[i][NR]=$i} \
    END{PROCINFO["sorted_in"]="@val_num_asc"; \
        for(j=1;j<NF+1;j++){ I=0; for(i in a[j]) A[++I][j]=a[j][i]} \
            for(i=1;i<NR+1;i++){ printf A[i][1]"."; \
                for(j=2;j<NF+1;j++) printf A[i][j]" "; printf "\n"}}' file

O acima pode parecer complicado no começo, mas na verdade é muito simples - ele apenas armazena o arquivo inteiro no array a , e no final recorre ao array A como desejado. O principal truque é usar @val_num_asc , pois queremos classificar as colunas por valores em ordem numérica crescente.

Deve funcionar para qualquer número de linhas e colunas, apenas tenha em mente que o arquivo inteiro é armazenado na memória, portanto, pode ser lento para tabelas grandes.

    
por 20.11.2015 / 03:38
0
#!/bin/sh

for i in 1 2 3 4
do
    tr . " " < "${1:?}" | cut -d' ' -f$i | sort > $$-$i
done

paste -d. $$-[12] | paste -d' ' - $$-[34]

rm $$-[1234]
    
por 20.11.2015 / 01:27