Например, в приведенном ниже примере
Я хочу удалить дубликаты идентификаторов от второго столбца и напечатайте только те идентификаторы, которые имеют наибольшее значение в третьем столбце
MS1199089 PT01000001.1.1 0.63 16.4 0.7 -
MS0068379 PT01000007.1.1 0.96 13.9 0.4 core
MS0950857 PT01000010.1.8 0.1 17.5 0.2 S11
MS0736357 PT01000010.1.8 0.062 18.2 0.5 (Saprolegnia
MS0260587 PT01000010.1.2 0.5 15.4 0.1 VII-activating
MS0402367 PT01000010.1.2 0.6 15.1 0.1 V-activating
MS0416158 PT01000010.1.2 0.65 15 0.1 Callorhinchus
MS0438713 PT01000010.1.3 0.2 18.1 0 TRP3
MS0436466 PT01000010.1.3 0.48 17 0 -
MS0436647 PT01000010.1.3 0.49 16.9 0 Stomatobaculum
MS0438816 PT01000010.1.3 0.59 16.7 0 peptidase
MS0436602 PT01000010.1.3 0.55 16.8 0 Desulfosporosinus
Вывод должен быть
MS1199089 PT01000001.1.1 0.63 16.4 0.7 -
MS0068379 PT01000007.1.1 0.96 13.9 0.4 core
MS0950857 PT01000010.1.8 0.1 17.5 0.2 S11
MS0416158 PT01000010.1.2 0.65 15 0.1 Callorhinchus
MS0438816 PT01000010.1.3 0.59 16.7 0 peptidase
Это может быть сделано с вид
как так:
sort -uk2,2 <(sort -k3,3rn FileName)
Изменение FileName
к названию ваш файл и выполненный команда из того же каталога, содержащего ваш файл.
вывод:
MS1199089 PT01000001.1.1 0.63 16.4 0.7 -
MS0068379 PT01000007.1.1 0.96 13.9 0.4 core
MS0416158 PT01000010.1.2 0.65 15 0.1 Callorhinchus
MS0438816 PT01000010.1.3 0.59 16.7 0 peptidase
MS0950857 PT01000010.1.8 0.1 17.5 0.2 S11
Для сохранения первоначальный заказ , однако, можно использовать grep
с вид
как так:
grep "$(sort -k3,3rn FileName | sort -uk2,2)" FileName
Изменение оба случаев из FileName
к названию ваш файл и выполненный команда из того же каталога, содержащего ваш файл.
вывод:
MS1199089 PT01000001.1.1 0.63 16.4 0.7 -
MS0068379 PT01000007.1.1 0.96 13.9 0.4 core
MS0950857 PT01000010.1.8 0.1 17.5 0.2 S11
MS0416158 PT01000010.1.2 0.65 15 0.1 Callorhinchus
MS0438816 PT01000010.1.3 0.59 16.7 0 peptidase
К сохраняют вывод из любого команды выше к файл , добавляют > SaveOutput.txt
после них как так:
sort -uk2,2 <(sort -k3,3rn FileName) > SaveOutput.txt
и
grep "$(sort -k3,3rn FileName | sort -uk2,2)" FileName > SaveOutput.txt
вывод будет сохранен в файл, названный SaveOutput.txt
в том же каталоге.
см. вид человека
и человек grep
для получения дополнительной информации.
также взгляните на то, что делает LC_ALL=C и почему вам, возможно, понадобился бы он. Спасибо @bac0n для перевода в рабочее состояние его в комментарии .
, которыеДополнительный поцелуй, который позволяет избежать сортировки, будет обработать файл дважды, в первый раз, когда вы найдете максимальные значения каждого второго ключа столбца, а также второе, чтобы распечатать строки, которые Содержать эти значения:
$ awk 'NR==FNR{x[$2] = $3+0 > x[$2] ? $3 : x[$2]; next} $3 == x[$2] {print}' file file
MS1199089 PT01000001.1.1 0.63 16.4 0.7 -
MS0068379 PT01000007.1.1 0.96 13.9 0.4 core
MS0950857 PT01000010.1.8 0.1 17.5 0.2 S11
MS0416158 PT01000010.1.2 0.65 15 0.1 Callorhinchus
MS0438816 PT01000010.1.3 0.59 16.7 0 peptidase
Как он стоит, это будет распечатать все экземпляры, которые галстук для каждого максимума - вы можете добавить ! Условие [$ 2] ++
, чтобы ограничить его к первому вхождению.
Я думаю, что это то, что вы ищете:
$ sort -gt' ' -k3,3r foo.txt | awk '!seen[$2]++' | sort -t' ' -k2
MS1199089 PT01000001.1.1 0.63 16.4 0.7 -
MS0068379 PT01000007.1.1 0.96 13.9 0.4 core
MS0416158 PT01000010.1.2 0.65 15 0.1 Callorhinchus
MS0438816 PT01000010.1.3 0.59 16.7 0 peptidase
MS0950857 PT01000010.1.8 0.1 17.5 0.2 S11