Как удалить дубликаты и распечатать только те строки, которые содержат строку и имеет наибольшее значение в определенном столбце

Например, в приведенном ниже примере

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

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  
1
задан 16 February 2021 в 23:09

3 ответа

Это может быть сделано с вид как так:

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 для перевода в рабочее состояние его в комментарии .

, которые
1
ответ дан 18 March 2021 в 23:34

Дополнительный поцелуй, который позволяет избежать сортировки, будет обработать файл дважды, в первый раз, когда вы найдете максимальные значения каждого второго ключа столбца, а также второе, чтобы распечатать строки, которые Содержать эти значения:

$ 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] ++ , чтобы ограничить его к первому вхождению.

4
ответ дан 18 March 2021 в 23:34

Я думаю, что это то, что вы ищете:

$ 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
2
ответ дан 18 March 2021 в 23:34

Другие вопросы по тегам:

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