Как сортировать группы строк вместе?

у меня есть этот файл:

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

для каждого значения есть три строки с ADD, VAR, USER на . Я хочу отсортировать (обратная сортировка) файл на основе значения для строк с USER на . Вопрос в том, как я мог это сделать и в то же время сохранить соответствующие строки с 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 строки:

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

спасибо

2 ответов


Это немного грязный, но делает то, что вы хотите:

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

проблема с форматом ввода заключается в том, что сортировка не может работать с группами входных строк, поэтому вам нужно превратить каждую группу в одну строку, отсортировать ее, а затем повернуть ее обратно. Это работает только в том случае, если строка ввода "пользователь" всегда последняя в группе.


вот однострочный для 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