2013-09-10 40 views
6

我有這個文件:如何將線組分組在一起?

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 

對於$1每個值,有三行ADDVAR,在$3USER。我想根據的中的$6值對文件進行排序(反向排序)。問題是我如何做到這一點,同時在排序的行旁邊保留ADD,VAR的對應行。我不需要對其他兩行進行排序;我只需要他們在sorted線旁邊。

所需的輸出:

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 

我曾嘗試這個代碼,但它只是在USER線基礎上,$6值排序:

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

謝謝

+0

對於樣本數據,要求的輸出和... gasp,...良好的格式化問題+1。示例代碼; - )。您可以指定多個鍵進行排序。 '-k2 -k3 -k6'可能會起作用。祝你好運。 – shellter

+0

看看這個例子,它是沿着相同的線我相信 http://stackoverflow.com/questions/3832068/bash-sort-text-file-by-last-field-value – TopGunCoder

+0

@shelter:不幸的是,它似乎沒有工作 – user2162153

回答

5

這是一個有點亂,但你想要做什麼:

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

與輸入格式的問題是那種已經沒有辦法對輸入線組工作,所以你需要將每個組合成一條線,對其進行排序,然後再將其返回。這隻適用於輸入「USER」行總是在組中最後一行的情況。

1

這裏有一個單紅寶石襯裏:)

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

輸出:

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

謝謝。我是否需要用我的文件名替換第一個'File'?你能解釋一下代碼嗎? – user2162153

+0

@ user2162153您需要替換的唯一東西是參數'file'。 – konsolebox

+0

謝謝。我得到這個錯誤。我得到這個錯誤:-e:1:未定義的方法'group_by'for#(NoMethodError)順便說一下,我更正了$ 6中的值,因爲它們沒有反向排序 – user2162153