2010-07-07 20 views
13

Vorrei ordinare un file su più campi. file A scheda campione separato è:ordinamento unix, con chiavi primarie e secondarie

a 1 1.0 
b 2 0.1 
c 3 0.3 
a 4 0.001 
c 5 0.5 
a 6 0.01 
b 7 0.01 
a 8 0.35 
b 9 2.3 
c 10 0.1 
c 11 1.0 
b 12 3.1 
a 13 2.1 

e mi piace averlo ordinato alfabeticamente campo 1 (con -d), e quando campo1 è la stessa, ordina in campo 3 (con l'opzione -g).

A non è riuscito a farlo. I miei tentativi sono stati (con un vero e proprio carattere di tabulazione invece di <TAB>):

cat tst | sort -t"<TAB>" -k1 -k3n 
cat tst | sort -t"<TAB>" -k1d -k3n 
cat tst | sort -t"<TAB>" -k3n -k1d 

Nessuno di questi stanno lavorando. Non sono sicuro che l'ordinamento sia persino in grado di farlo. Scriverò uno script per risolvere il problema, quindi sono curioso di sapere se esiste una soluzione che utilizza solo lo ordinamento.

+0

Il ' Il comando sort' sembra non supportare questo. Prendi in considerazione il passaggio a una lingua come Python o Perl. – Philipp

+0

Sì, certo che sarà la mia soluzione, come ho detto. Volevo solo sapere se si può fare con puro tipo – zseder

risposta

11

Il manual mostra alcuni esempi.

In accordo con il commento di zseder, questo funziona:

sort -t"<TAB>" -k1,1d -k3,3g 

Tab dovrebbe teoricamente funzionare anche come questo sort -t"\t".

Se nessuno dei lavori di cui sopra per delimitare dalla scheda, questa è una soluzione brutta:

TAB=`echo -e "\t"` 
sort -t"$TAB" 
+0

Questo funziona! Grazie. (Con cmd: 'sort -t" "-k1,1d -k3,3g') Tuttavia, non ho trovato cosa vuol dire virgola per ordinare nel manuale collegato e nella normale pagina di manuale. Devo google di più su questo. E sì, posso ordinare con schede. Posso sedarlo su qualsiasi altro separatore e posso dare TAB al mio terminale con "ctrl + v; TAB", quindi non è un problema, volevo solo chiarire che non è quello che sto facendo male. In ogni caso, grazie! – zseder

+1

È anche possibile creare una scheda senza usare 'echo' o ctrl + v:' TAB = $ '\ t''. @zseder: la virgola è un operatore di intervallo in questo contesto. L'argomento '-k1,1d' significa" crea una chiave che inizia alla prima colonna e termina alla prima colonna nell'ordine dei dizionari ". –

+0

E come mai che -k1d non è uguale a -k1,1d? La mia intenzione è che questi dovrebbero essere gli stessi ... – zseder

-3

Ecco uno script Python che si potrebbe utilizzare come punto di partenza:

#!/usr/bin/env python2.6 

import sys 
import string 

def main(): 
    fname = sys.argv[1] 
    data = [] 
    with open(fname, "rt") as stream: 
     for line in stream: 
      line = line.strip() 
      a, b, c = line.split() 
      data.append((a, int(b), float(c))) 
    data.sort(key=my_key) 
    print data 


def my_key(item): 
    a, b, c = item 
    return c, lexicographical_key(a) 


def lexicographical_key(a): 
    # poor man's attempt, should use Unicode classification etc. 
    return a.translate(None, string.punctuation) 


if __name__ == "__main__": 
    main() 
Problemi correlati