Classifique apenas uma coluna, mantendo as colunas restantes intocadas

5

Como (numericamente) classificar uma coluna específica em um arquivo de texto, sem afetar outras colunas (independentemente de estarem classificadas ou não separadas)? Em outros tópicos, encontrei o argumento -s , mas ele classifica outras colunas.

Observação

$ cat tmp.txt
1 1
2 3
5 4
1 3

$ sort -s -n -k1,1 tmp.txt
1 1
1 3
2 3
5 4
    
por user13107 16.02.2014 / 09:57

3 respostas

5

Como mencionado nos comentários, você não pode conseguir o que deseja usando sort sozinho.

Você poderia cut do arquivo de entrada, alimentar parte relevante para sort e paste para esses.

$ paste -d' ' <(cut -d' ' -f1 input | sort -n) <(cut -d' ' -f2- input)
1 1
1 3
2 4
5 3
    
por 16.02.2014 / 10:12
1

Uma solução em perl :

perl -lane '
 push @first , $F[0];
 push @second, $F[1];
 END{
    @first = sort { $a <=> $b } @first;
    print "$fist[$_] $second[$_]" for (0..$#first)
 }' your_file

Ele assume que a primeira coluna (aquela a ser classificada) consiste apenas em dados numéricos.

    
por 16.02.2014 / 11:35
0

Estou no solaris e precisava de uma resposta sem ordenação e a resposta aceita não estava funcionando para mim. Joeyg no unix.com teve a resposta: classificar apenas uma coluna

cat tmp.txt
1 5
2 3
5 4
1 3

#Sort by 1st column leaving second stable sorted by the 1st.
cat -n tmp.txt | sort -k 2,2 | awk '{print $2,$3}'
1 5
1 3
2 3
5 4

#Sort by 2nd column leaving first stable sorted by the 2nd.
cat -n tmp.txt | sort -k 3,3 | awk '{print $2,$3}'
2 3
1 3
5 4
1 5

Uma interpretação diferente por meio de um comentário é classificar uma única coluna sem afetar o restante:

#Sort by 1st column leaving other columns untouched:
cat -n tmp.txt | sort -k 2,2 | awk '{a[NR]=$2;b[$1]=$3} END {for (i=1;i<=NR;i++)print a[i]" "b[i]}'
1 5
1 3
2 4
5 3

Explanation:
cat -n adds rownums to force sort to do "sort -s" without GNU sort.
sort -k 2,2 sorts by the 1st column

NR is a built-in variable that holds the row num.
a[NR]=$2; puts the sorted column in a[1..4]
b[$1]=$3; puts the "unsorted" 2nd column in b[rownum from cat]
Then the for loop just outputs the two arrays.

O que eu precisava quais eram as entradas da coluna 3 mais recentes exclusivas no arquivo. por exemplo,

cat tmp2.txt
5|1|3
4|2|1
1|3|2
3|4|1
2|5|2

cat -n tmp2.txt | sort -k 3 -rut '|' | awk '{print $2}'
5|1|3
2|5|2
3|4|1
    
por 03.06.2015 / 23:09