Ordinamento dei dati in base alla seconda colonna di un file


213

Ho un file di due colonne e n numero di righe.

la colonna 1 contiene namese la colonna2age .

Voglio ordinare il contenuto di questo file in ordine crescente in base a age (nella seconda colonna).

Il risultato dovrebbe mostrare nameinsieme alla persona più giovanename e poi la seconda persona più giovane e così via ...

Eventuali suggerimenti per una shell o uno script bash.


Risposte:


330

Puoi usare il sortcomando :

sort -k2 -n yourfile

-n, --numeric-sortconfrontare in base al valore numerico della stringa

Per esempio:

$ cat ages.txt 
Bob 12
Jane 48
Mark 3
Tashi 54

$ sort -k2 -n ages.txt 
Mark 3
Bob 12
Jane 48
Tashi 54

1
nota inoltre che l'utilizzo di -hinvece -nordinerà valori umani leggibili come 2Go 3Kcosì come numeri separati da virgole, ad es.1,234.5
chillitom,

Si è verificato un problema con un ordine "errato". Prestare attenzione all'uomo "*** AVVISO *** Le impostazioni internazionali specificate dall'ambiente influiscono sull'ordinamento. Impostare LC_ALL=Cper ottenere l'ordinamento tradizionale che utilizza valori di byte nativi." (per la corrispondenza delle stringhe senza -n)
x'ES

Questo non considera gli spazi nella prima colonna né funziona se ci sono più colonne dopo la seconda, dato che -k ha letto fino alla fine della riga. Supponendo che sia un file TSV, una soluzione migliore èsort -t$'\t' -k2 -n FILE
tuxErrante,

potresti dover specificare il delimitatore usando l'opzione -t
spettro

85

Soluzione:

sort -k 2 -n filename

più verbalmente scritto come:

sort --key 2 --numeric-sort filename


Esempio:

$ cat filename
A 12
B 48
C 3

$ sort --key 2 --numeric-sort filename 
C 3
A 12
B 48

Spiegazione:

  • -k # : questo argomento specifica la prima colonna che verrà utilizzata per ordinare. (nota che la colonna qui è definita come un campo delimitato da spazi bianchi; l'argomento -k5verrà ordinato a partire dal quinto campo in ogni riga, non dal quinto carattere in ogni riga)

  • -n - questa opzione specifica un "ordinamento numerico" che significa che la colonna deve essere interpretata come una riga di numeri, anziché come testo.


Di Più:

Altre opzioni comuni includono:

  • -r - questa opzione inverte l'ordinamento. Può anche essere scritto come --reverse .
  • -i - Questa opzione ignora i caratteri non stampabili. Può anche essere scritto come --ignore-nonprinting .
  • -b - Questa opzione ignora gli spazi vuoti iniziali, utile poiché vengono utilizzati spazi bianchi per determinare il numero di righe. Può anche essere scritto come --ignore-leading-blanks .
  • -f - Questa opzione ignora il maiuscolo / minuscolo. "A" == "a". Può anche essere scritto come --ignore-case .
  • -t [nuovo separatore] : questa opzione consente alla preelaborazione di utilizzare un operatore diverso dallo spazio. Può anche essere scritto come --field-separator .

Esistono altre opzioni, ma queste sono le più comuni e utili che utilizzo spesso.


@Angelo Questa risposta è stata presumibilmente pubblicata anni dopo aver accettato una risposta a questa domanda, ma l'hai considerata come la nuova risposta accettata?
Jonathan Y.

L'opzione -tera un vero salvavita !! quando le colonne hanno spazi e le colonne differiscono per un dato carattere ,o una scheda
AKS

12

Per i valori separati da tabulazione è possibile utilizzare il codice seguente

sort -t$'\t' -k2 -n

-r può essere utilizzato per ottenere i dati in ordine decrescente.
-n per l'ordinamento numerico
-k, --key = POS1 [, POS2] dove k è colonna nel file
Per l'ordine decrescente di seguito è il codice

sort -t$'\t' -k2 -rn

4

Usa sort.

sort ... -k 2,2 ...

8
È inoltre necessario utilizzare -n per ordinare in base alle età (ordinamento numerico). Altrimenti '11' verrà prima di '2'.
Matt Ryall,
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.