Извлечение одной строки, содержащую наибольшее значение в данном столбце из текстового файла из каждой последовательно пронумерованной подгруппы / семьи

Ваша среда будет переносимой (например, ее можно брать где угодно), но не будет создавать переносимые двоичные файлы (например, запускаться в любом дистрибутиве). Библиотеки и конфигурация различаются в зависимости от дистрибутива, в некоторых случаях они просто не работают (например, несколько раз случалось с библиотеками C ++). Вы столкнетесь с проблемами даже при попытке запустить что-то из дистрибутива n + 1 на версии n.

1
04.01.2019, 07:10
3 ответа

С помощью GNU datamash(и небольшой помощи отcut):

$ datamash -Wf groupby 2 max 3 < file.txt | cut -f1-6
TTGSCA  family_1    18.123083   681 36349   1
CTTRAG  family_2    17.844843   685 37001   1
WGCCAA. family_3    19.99668    747 38506   1
SCACTT  family_4    19.759317   687 34686   1
1
27.01.2020, 23:42

Ниже приведен более чистый способ получения желаемого результата, чем мой предыдущий ответ. Это требует, чтобы sortиспользовалось дважды, но это намного лучше, чем использование sort, grepи tailчетыре раза.

sort -k3r numbers | awk '!seen[$2]++' | sort -k2

Выход:

TTGSCA  family_1    18.123083   681 36349   1
CTTRAG  family_2    17.844843   685 37001   1
WGCCAA. family_3    19.99668    747 38506   1
SCACTT  family_4    19.759317   687 34686   1
0
27.01.2020, 23:42

Я думаю, что datamashэто, вероятно, лучший инструмент, но вот своеобразная -уникальная альтернатива:

<infile sort -k2,2V -k3,3n | awk 'NR==1 || $2!=p; { p=$2 }'
0
27.01.2020, 23:42

Теги

Похожие вопросы