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
?
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.
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
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