在Unix中将NA最小到NA最大的行排序

时间:2019-09-23 08:03:24

标签: sorting unix

我有一个六列数据框,如下所示:

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 :(得分:0)

使用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字符串都被计算在内,这可能不是正确的事情,但是由于不知道文件中的分隔符,我无法(例如对于制表符delim):

$ awk -F"\t" '{c=0;for(i=1;i<=NF;i++)if($i=="NA")c++;print c,$0}' file | ...