usa l'ordinamento GNU per ordinare con una sola chiave / prevenire l'ordinamento indesiderato di altre chiavi


9

Ho un file che contiene dati già ordinati e vorrei riordinare il file in base ai valori in una chiave, senza distruggere l'ordine dei dati nelle altre chiavi.

Come posso impedire all'ordinamento GNU di eseguire l'ordinamento delle righe in base ai valori delle chiavi che non ho specificato o come posso specificare all'ordinamento GNU per ignorare un intervallo di chiavi durante l'ordinamento?

File data.txt:

1 Don't
2 C 
1 Sort
2 B
1 Me
2 A

Uscita prevista:

1 Don't
1 Sort
1 Me
2 C
2 B
2 A

Comando:

sort -k 1,1 <data.txt

Risultato: smistamento indesiderato Non ho chiesto:

1 Don't
1 Me
1 Sort
2 A
2 B
2 C

Risposte:


21

Hai bisogno di un ordinamento stabile . Da man sort:

-s, --stable
       stabilize sort by disabling last-resort comparison

cioè.:

$ sort -sk 1,1 <data.txt
1 Don't
1 Sort
1 Me
2 C 
2 B
2 A

Si noti che probabilmente si desidera anche un -no --numeric-sortse la chiave è numerica (ad esempio, è possibile ottenere risultati imprevisti se si confrontano da 10 a 2 con l'ordinamento predefinito - lessicale -). Nel qual caso è solo una questione di fare:

sort -sn <data.txt

Non è necessario estrarre il primo campo poiché l'interpretazione numerica dell'intera riga sarà la stessa di quella del primo campo.



Ho letto i documenti ma la corretta definizione di "stabile" ha eluso la mia attenzione. Grazie per la risposta rapida, concisa e ben citata. La prima chiave dei dati reali è una stringa localizzata, quindi il numero non funzionerebbe per me.
Wil

4

Per sortimplementazioni (non GNU) prive di -sun'opzione, puoi sempre fare:

<data.txt awk '{print NR "\t" $0}' | sort -n -k 2,2 -k 1,1 | cut -f 2-

Cioè, anteponi il numero di riga per renderlo il secondo tasto di ordinamento e rimuovilo successivamente.

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.