Ordinamento dei file per prima e poi per seconda colonna


13

Come posso manipolare un file di testo separato da tabulazioni di due colonne ordinando per il primo elemento della seconda colonna (solo se il primo elemento della colonna è lo stesso)?

Esempio:

File di input 1

A   1-2
A   6-8
A   3-4
B   7-10
B   5-9

Output previsto: file 2

A   1-2
A   3-4
A   6-8
B   5-9
B   7-10

Risposte:


22

Usa l sort' -kopzione per ordinare per (più) colonne contemporaneamente:

$ sort -k1,1 -k2n input
A   1-2
A   3-4
A   6-8
B   5-9
B   7-10

-k1,1ordina prima la prima colonna, poi -k2nnumericamente la seconda¹ quando la prima colonna era legata, in modo da ottenere l'output nell'ordine desiderato: ordinamento in base al primo elemento della seconda colonna, solo se il primo elemento della colonna è lo stesso.

Quando si ordina numericamente, esaminerà il campo solo fino a quando non smette di essere un numero, in modo che ti dia un confronto solo del primo elemento di esso.

Quando le due chiavi si confrontano allo stesso modo, sortconfronta le righe complete in modo lessicale come confronto di ultima istanza. Ad esempio in A 1-10vs A 1-2, le prime chiavi sono identiche ( Astringa), e anche la seconda chiave (entrambe sono trattate come il numero 1), quindi sortconfronta A 1-10vs A 1-2lessicamente e quest'ultima è maggiore come 2ordinamento dopo 1. L'implementazione GNU di sortha -Vun'opzione o Vun flag chiave per eseguire un ordinamento di versione , che è come un confronto lessicale, tranne per il fatto che le sequenze di cifre decimali all'interno delle stringhe vengono confrontate numericamente, quindi sort -k1,1 -k2Vverranno ordinate A 1-10dopo A 1-2perché 10un numero è maggiore di 2.


¹ tecnicamente, -k2indica la parte della linea che inizia con il secondo campo (dopo la prima transizione da un non vuoto a uno vuoto) e termina alla fine della linea, ma con la nbandiera, equivale a -k2,2nsolo la parte iniziale che costituisce un numero è considerato.

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.