it-swarm-eu.dev

Come UNIX ordinare solo per una colonna?

So che l'opzione -k per Unix sort ci consente di ordinare per una colonna specifica e tutti i seguenti . Ad esempio, dato il file di input:

2 3
2 2
1 2
2 1
1 1

Usando sort -n -k 1, ottengo un'uscita ordinata per la prima colonna e poi per la seconda:

1 1
1 2
2 1
2 2
2 3

Tuttavia, voglio mantenere l'ordine della seconda colonna, in questo modo:

1 2
1 1
2 3
2 2
2 1

Questo è possibile con il comando sort?

46
ssn

Fare un tentativo:

sort -s -n -k 1,1

Il -s disabilita l'ordinamento 'last-resort', che ordina su tutto ciò che non faceva parte di una chiave specificata.

-k 1 non significa in realtà "questo campo e tutti i seguenti" nel contesto dell'ordinamento numerico, come puoi vedere se provi a ordinare sulla seconda colonna. Stai semplicemente vedendo i legami spezzati andando al resto della linea. In generale, tuttavia, è necessario specificare -k 1,1 per ordinare solo sul campo uno.

62
Cascabel

Per ordinare solo sulla prima colonna dovresti fare:

sort -n -s -k1,1

Da Manuale di amministrazione del sistema Unix e Linux

sort accetta le specifiche chiave -k3 (piuttosto che -k3,3), ma probabilmente non fa ciò che ci si aspetta. Senza il numero del campo di terminazione, la chiave di ordinamento continua fino alla fine della riga

10
tidbeck

Nessuna delle risposte fornite funziona in generale per me.

Sia sort -s -k 2 file1 che sort -n -k1,1 eseguono ulteriori ordinamenti con questo file:

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

Ho solo dovuto fare questa cosa esatta e ho finito per usare un ciclo Shell. Questa soluzione potrebbe non funzionare correttamente su un file molto grande perché l'intero file deve essere letto per ogni valore univoco 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
2
user680341