Сортировать строки с наименьшим количеством NA на наибольшее количество NA в Unix - PullRequest
1 голос
/ 23 сентября 2019

У меня есть фрейм данных из шести столбцов, как показано ниже:

A   Sample_a    Sample_a,Sample_b   Sample_a,Sample_b,Sample_c
B   Sample_b    Sample_c    NA
C   Sample_c    NA  NA
D   Sample_d    Sample_d,Sample_e   Sample_d,Sample_e,Sample_f
E   Sample_e    Sample_f    NA
F   Sample_f    NA  NA

Я хочу отсортировать данные по строкам с наименьшим NA, за которым следует наибольшее NA.Я ожидаю получить вывод ниже:

A       Sample_a        Sample_a,Sample_b       Sample_a,Sample_b,Sample_c
D       Sample_d        Sample_d,Sample_e       Sample_d,Sample_e,Sample_f
B       Sample_b        Sample_c        NA
E       Sample_e        Sample_f        NA
C       Sample_c        NA      NA
F       Sample_f        NA      NA

Однако, когда я попытался сделать sort -r -k3 -r -k4, но он дает мне вывод ниже:

E   Sample_e    Sample_f    NA
D   Sample_d    Sample_d,Sample_e   Sample_d,Sample_e,Sample_f
B   Sample_b    Sample_c    NA
A   Sample_a    Sample_a,Sample_b   Sample_a,Sample_b,Sample_c
F   Sample_f    NA  NA
C   Sample_c    NA  NA

Как мне отсортировать таблицуправильно в этом случае?Заранее спасибо.

1 Ответ

0 голосов
/ 23 сентября 2019

Используйте awk для подсчета NA в записях, вывода номера и записи, используйте sort и удалите первый столбец с помощью cut:

$ awk '{tmp=$0; print gsub(/NA/,"NA",tmp),$0 }' file |  # append count of NAs
sort -n |                                               # sort 
cut -d\  -f 2-                                          # remove count

Вывод:

A   Sample_a    Sample_a,Sample_b   Sample_a,Sample_b,Sample_c
D   Sample_d    Sample_d,Sample_e   Sample_d,Sample_e,Sample_f
B   Sample_b    Sample_c    NA
E   Sample_e    Sample_f    NA
C   Sample_c    NA  NA
F   Sample_f    NA  NA

Вам может понадобиться настроить разделители и т. Д. Для команд по своему вкусу, но это общий подход.Кроме того, в ATM считаются все строки NA, что может быть неправильно, но из-за отсутствия знания разделителей в файле я не смог (например, для разделителя табуляции):

$ awk -F"\t" '{c=0;for(i=1;i<=NF;i++)if($i=="NA")c++;print c,$0}' file | ...
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...