2009-08-31 16:20:22 +0000 2009-08-31 16:20:22 +0000
48
48

Come ordinare UNIX per una sola colonna?

So che l'opzione -k per Unix sort ci permette di ordinare per una colonna specifica e tutte le seguenti. Per esempio, dato il file di input

2 3
2 2
1 2
2 1
1 1

Usando sort -n -k 1, ottengo un output ordinato per la 1° colonna e poi per la 2°:

1 1
1 2
2 1
2 2
2 3

Tuttavia, voglio mantenere l'ordinamento della 2° colonna, come questo:

1 2
1 1
2 3
2 2
2 1

È possibile con il comando sort?

Risposte (3)

68
68
68
2009-08-31 16:28:27 +0000

Prova questo:

sort -s -n -k 1,1

Lo -s disabilita l'ordinamento ‘last-resort’, che ordina su tutto ciò che non fa parte di una chiave specificata.

Lo -k 1 non significa in realtà “questo campo e tutti i seguenti” nel contesto dell'ordinamento numerico, come potete vedere se provate ad ordinare sulla seconda colonna. State semplicemente vedendo i legami spezzati passando al resto della riga. In generale, comunque, dovete specificare -k 1,1 per ordinare solo sul campo uno.

10
10
10
2012-10-16 13:59:28 +0000

Per ordinare solo sulla prima colonna si dovrebbe fare:

sort -n -s -k1,1

Da Unix and Linux System Administration Handbook

sort accetta la specifica della chiave -k3 (piuttosto che -k3,3), ma probabilmente non fa quello che ti aspetti. Senza il numero di campo finale, la chiave di ordinamento continua fino alla fine della linea

2
2
2
2016-12-30 17:47:12 +0000

Nessuna delle risposte fornite funziona generalmente per me.

Sia sort -s -k 2 file1 che sort -n -k1,1 fanno un ulteriore ordinamento con questo file:

# cat file1
 3 3 5
 3 2 3
 1 4 7
 0 1 2
 3 2 1

Ho dovuto fare proprio questa cosa e ho finito per usare un ciclo di shell. Questa soluzione potrebbe non funzionare bene su un file molto grande perché l'intero file deve essere letto per ogni valore unico nella colonna ordinata.

Qui il file è ordinato solo sulla colonna 2.

# awk '{print $2}' file1 | sort | uniq | while read index
do  
    awk -v var=$index '$2 == var { print $0}' file1 
done
 0 1 2
 3 2 3
 3 2 1
 3 3 5
 1 4 7