7

我有这个文件:

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,有三行带有ADD, VAR, USERin $3。我想根据in$6行的值对文件进行排序(反向排序) 。问题是我怎么能做到这一点,同时将相应的行与,放在已排序的行旁边。我不需要对其他两行进行排序;我只需要他们在线路旁边。USER$3ADDVARsorted

期望的输出:

 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

我已经尝试过这段代码,但它只根据行中的$6值进行排序USER

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

谢谢

4

2 回答 2

5

这有点混乱,但可以满足您的要求:

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

输入格式的问题是 sort 无法对输入行的组进行操作,所以需要将每组变成一行,排序,然后再返回。这仅在输入“USER”行始终是组中的最后一个时才有效。

于 2013-09-11T00:08:31.820 回答
2

这是Ruby的单行代码:)

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
于 2013-09-10T23:48:32.493 回答