2013-09-10 27 views
6

mam ten plikJak sortować grupy linii?

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 

dla każdej wartości w $1 istnieją trzy linie z ADD, VAR, USER w $3. Chcę sortować (odwrócić sortowanie) plik na podstawie wartości $6 dla linii z USER w $3. Pytanie brzmi, jak mógłbym to zrobić ORAZ jednocześnie zachowując odpowiednie linie z ADD, VAR obok posortowanych linii. Nie potrzebuję sortować pozostałych dwóch linii; Po prostu potrzebuję ich obok linii sorted.

Pożądany wyjściowa:

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 

Próbowałem ten kod, ale to tylko sortuje oparte na wartościach $6 w USER linii:

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

Dziękuję

+0

+1 dla dobrze sformatowanego pytania z przykładowymi danymi, wymaganą wydajnością i ... sondą, ... przykładowym kodem; -). Możesz określić wiele kluczy do sortowania. '-k2 -k3 -k6' może działać. Powodzenia. – shellter

+0

Spójrz na ten przykład, to jest na tej samej linii Wierzę http://stackoverflow.com/questions/3832068/bash-sort-text-file-by-last-field-value – TopGunCoder

+0

@shelter: Niestety, to chyba nie działa – user2162153

Odpowiedz

5

To jest trochę brudny, ale robi to, co chcesz:

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

Problem z formatem wejściowym jest tego rodzaju nie ma możliwości, aby działać na grupach wierszy wejściowych, więc musisz zmienić każdą grupę w jedną linię, posortować, a następnie odwrócić. Działa to tylko wtedy, gdy linia wejściowa "USER" jest zawsze ostatnia w grupie.

1

Oto jedno- wkładka do Ruby :)

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

wyjściowa:

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

Dziękuję. Czy muszę również zastąpić pierwszy "Plik" moją nazwą pliku? Czy mógłbyś trochę wyjaśnić kod? – user2162153

+0

@ user2162153 Jedyną rzeczą, którą należy zamienić, jest argument "plik". – konsolebox

+0

Dzięki. Dostaję ten błąd. Otrzymuję ten błąd: -e: 1: niezdefiniowana metoda 'group_by 'dla # (NoMethodError) Przy okazji, poprawiłem wartości w 6 $, ponieważ nie zostały posortowane odwrotnie – user2162153