2013-09-10 13 views
6

devo questo file:Come ordinare i gruppi di linee insieme?

rs1 1 ADD  0.7  0.75  0.45 
rs1 1 VAR  0.4  4.53  0.06 
rs1 1 USER NA  1.96  0.37 
rs2 2 ADD  1.5  0.25  0.23 
rs2 2 VAR  0.4  4.86  0.03 
rs2 2 USER NA  1.73  0.05 
rs3 3 ADD  0.29 0.76  0.97 
rs3 3 VAR  0.44 3.95  0.09 
rs3 3 USER 0.96 5.41  0.01 

Per ogni valore in $1, ci sono tre linee con ADD, VAR, USER in $3. Voglio ordinare (in ordine inverso) il file basato sui valori $6 per le linee con USER in $3. La domanda è: come posso fare questo E allo stesso tempo mantenere le linee corrispondenti con ADD, VAR accanto alle righe ordinate. Non ho bisogno che le altre due linee siano ordinate; Ho solo bisogno che siano accanto alla linea sorted.

output desiderato:

rs3 3 ADD  0.29 0.76 0.97 
rs3 3 VAR  0.44 3.95 0.09 
rs3 3 USER 0.96 5.41 0.01 
rs2 2 ADD  1.5  0.25 0.23 
rs2 2 VAR  0.4  4.86 0.03 
rs2 2 USER NA  1.73 0.05 
rs1 1 ADD  0.7  0.75 0.45 
rs1 1 VAR  0.4  4.53 0.06 
rs1 1 USER NA  1.96 0.37 

Ho provato questo codice, ma solo le specie in base ai valori $6 in USER linee:

cat File | sort -k1 | uniq | sort -g -k6 > Output 

Grazie

+0

+1 per domande ben formate con dati di esempio, output richiesto e ... gasp, .... codice di esempio; -). È possibile specificare più chiavi da ordinare. '-k2 -k3 -k6' potrebbe funzionare. In bocca al lupo. – shellter

+0

Dai un'occhiata a questo esempio è sulla stessa linea credo http://stackoverflow.com/questions/3832068/bash-sort-text-file-by-last-field-value – TopGunCoder

+0

@shelter: Sfortunatamente, non sembra funzionare – user2162153

risposta

5

Questo è un po 'disordinato, ma fa quello che si vuole:

paste - - - < File | sort -k18,18g | xargs -n 6 

Il problema con il formato di ingresso è quel genere non ha modo di operare su gruppi di linee di ingresso, quindi è necessario trasformare ciascun gruppo in una riga, ordinarlo e quindi tornare indietro. Funziona solo se l'ingresso "USER" è sempre l'ultima nel gruppo.

1

Ecco un one liner per Ruby :)

ruby -e 'File.open(ARGV.shift).readlines.entries.group_by{|e| e.split[1]}.sort.reverse.each{|e| puts e[1]}' file 

uscita:

rs3 3 ADD  0.29 0.76  0.97 
rs3 3 VAR  0.44 3.95  0.09 
rs3 3 USER 0.96 5.41  0.05 
rs2 2 ADD  1.5  0.25  0.23 
rs2 2 VAR  0.4  4.86  0.03 
rs2 2 USER NA  1.73  0.01 
rs1 1 ADD  0.7  0.75  0.45 
rs1 1 VAR  0.4  4.53  0.06 
rs1 1 USER NA  1.96  0.37 
+0

Grazie. Devo sostituire anche il primo 'File' con il mio nome file? Potresti spiegare un po 'del codice? – user2162153

+0

@ user2162153 L'unica cosa che devi sostituire è l'argomento 'file'. – konsolebox

+0

Grazie. Ho ricevuto questo errore. Ottengo questo errore: -e: 1: metodo non definito 'group_by 'per # (NoMethodError) A proposito, ho corretto i valori in $ 6 perché non erano ordinati al contrario – user2162153

Problemi correlati