Come ordinare UNIX per una sola colonna?


47

So che l'opzione -k per l' ordinamento Unix ci consente di ordinare per una colonna specifica e tutto quanto segue . Ad 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 prima colonna e poi per la seconda:

1 1
1 2
2 1
2 2
2 3

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

1 2
1 1
2 3
2 2
2 1

Questo è possibile con il sortcomando?

Risposte:


65

Prova questo:

sort -s -n -k 1,1

Le -sdisabilita 'ultima spiaggia' di smistamento, che ordina su tutto ciò che non faceva parte di una chiave specificata.

In -k 1realtà non significa "questo campo e tutto quanto segue" nel contesto dell'ordinamento numerico, come puoi vedere se cerchi di ordinare sulla seconda colonna. Stai semplicemente vedendo i legami rotti andando al resto della linea. In generale, tuttavia, è necessario specificare -k 1,1di ordinare solo sul campo uno.


Hai ragione. Questo è esattamente ciò di cui avevo bisogno. Grazie!

è possibile utilizzare join sull'output di questo tipo?
MiNdFrEaK,

@MiNdFrEaK: il requisito di joinè che l'input sia ordinato nei campi su cui ti stai unendo. Quindi, questo output è ordinato sul primo campo e puoi unirti ad esso.
Cascabel,

Ho 2 file, uno con 2 colonne, un altro con 1 colonna. Il secondo file viene ordinato usando sort -u. Ora il compito è che devo unire questa colonna con la prima colonna del primo file, che non è ordinato, quindi quale sarà la sintassi? funzionerà? join -j 1 file2.txt ordina -s -n -k 1 file1.txt?
MiNdFrEaK,

1
La parte -k 1,1(" 1 ") non funziona meglio per me. Ciò che funziona è -s -k 1, con -nse ne hai bisogno.
Totor

10

Per ordinare solo sulla prima colonna devi fare:

sort -n -s -k1,1

Dal manuale di amministrazione del sistema Unix e Linux

sort accetta la specifica chiave -k3 (anziché -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 riga


Non lavorando per me, devo aggiungere l' -sopzione come ha sottolineato Cascabel.
Jean Paul

@JeanPaul hai ragione, la documentazione per -sdice "Questa opzione mantiene l'ordine dei record originale dei record che hanno una chiave uguale".
martedì

2

Nessuna delle risposte fornite funziona generalmente per me.

Entrambi sort -s -k 2 file1e sort -n -k1,1fare l'ordinamento aggiuntivo con questo file:

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

Ho dovuto fare esattamente questa cosa e ho finito per usare un loop shell. Questa soluzione potrebbe non funzionare bene su un file molto grande perché è necessario leggere l'intero file per ciascun valore univoco nella colonna ordinata.

Qui il file è ordinato solo nella 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

sort -s -k2,2 file1
plhn,

La risposta proposta da Cascabel funziona ma penso che tu abbia letto male.
Jean Paul
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.