2013-09-10 117 views
6

Tôi có tập tin này:Làm thế nào để sắp xếp các nhóm đường thẳng với nhau?

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 

Đối với mỗi giá trị trong $1, có ba dòng với ADD, VAR, USER trong $3. Tôi muốn sắp xếp (sắp xếp ngược lại) tệp dựa trên các giá trị $6 cho các dòng có USER trong $3. Câu hỏi đặt ra là làm thế nào tôi có thể làm điều này và đồng thời giữ các dòng tương ứng với ADD, VAR bên cạnh các dòng được sắp xếp. Tôi không cần hai dòng khác được sắp xếp; Tôi chỉ cần họ ở bên cạnh đường dây sorted.

đầu ra mong muốn:

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 

Tôi đã thử mã này, nhưng nó chỉ loại dựa trên $6 giá trị trong USER dòng:

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

Cảm ơn bạn

+0

+1 cho câu hỏi được định dạng tốt với dữ liệu mẫu, đầu ra bắt buộc và ... mã mẫu, .... mẫu mã; -). Bạn có thể chỉ định nhiều phím để sắp xếp. '-k2 -k3 -k6' có thể hoạt động. Chúc may mắn. – shellter

+0

Hãy xem ví dụ này nó nằm dọc theo cùng một dòng mà tôi tin rằng http://stackoverflow.com/questions/3832068/bash-sort-text-file-by-last-field-value – TopGunCoder

+0

@shelter: Thật không may, nó dường như không hoạt động – user2162153

Trả lời

5

Đây là một chút lộn xộn nhưng làm những gì bạn muốn:

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

Vấn đề với định dạng đầu vào là loại mà không có cách nào để hoạt động trên các nhóm dòng đầu vào, vì vậy bạn cần phải biến từng nhóm thành một dòng, sắp xếp nó, sau đó quay lại. Điều này chỉ hoạt động nếu dòng nhập "USER" luôn nằm trong nhóm.

1

Dưới đây là một one- lót cho Ruby :)

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

Output:

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

Cảm ơn bạn. Tôi có cần phải thay thế 'File' đầu tiên bằng tên tệp của mình không? Bạn có thể giải thích một chút về mã? – user2162153

+0

@ user2162153 Điều duy nhất bạn cần thay thế là đối số 'tệp'. – konsolebox

+0

Cảm ơn. Tôi gặp lỗi này. Tôi nhận được lỗi này: -e: 1: undefined method 'group_by 'cho # (NoMethodError) Bằng cách này, tôi đã sửa các giá trị trong $ 6 vì chúng không được sắp xếp đảo ngược – user2162153