表操作

表操作

我有三个文件,其中基因组坐标和最后一列作为通用名称

文件 1。

X 1 100 B
Y 101 200 B
Z 1 50 B

文件2。

X 200 300 A 
Y 101 200 A
Z 1 50 A

文件 3。

X 1 100 C
Y 200 300 C
Z 1 50 C

我想根据最后一列操作我的数据

Name Value1 Value2 A B C
X 1 100 No Yes Yes
X 200 300 Yes No No
Y 101 200 Yes Yes No
Y 200 300 No No Yes
Z 1 50 Yes Yes Yes

.. 像这样。

你能帮忙吗?

答案1

awk解决方案:

awk 'function get_mask(keys){ 
         mask=""; 
         for(i in h) { 
             res=(keys~i)?"Yes":"No"; mask=(mask!="")? mask FS res:res 
         } 
         return mask 
     }
     { k=$1 FS $2 FS $3 }{ h[$4]; a[k]=(a[k])? a[k]$4:$4 }
     END{ 
         h_line=""; for(i in h) h_line=(h_line=="")? i:h_line FS i;
         printf "Name Value1 Value2 %s\n",h_line;
         for(j in a) printf "%s %s\n", j, get_mask(a[j]) 
     }' file{1,2,3}

输出:

Name Value1 Value2 A B C
Z 1 50 Yes Yes Yes
Y 101 200 Yes Yes No
Y 200 300 No No Yes
X 1 100 No Yes Yes
X 200 300 Yes No No

答案2

与罗马的答案非常相似,但我认为更简单一些

gawk '
    { key = $1 FS $2 FS $3; names[$NF] = 1; has_name[key][$4] = 1 }
    END {
        PROCINFO["sorted_in"] = "@ind_str_asc"
        printf "Name Value1 Value2"
        for (v in names) printf " %s", v
        print ""
        for (key in has_name) {
            printf "%s", key
            for (v in names) printf " %s", has_name[key][v] ? "Yes" : "No"
            print ""
        }
    }
' file{1,2,3}
Name Value1 Value2 A B C
X 1 100 No Yes Yes
X 200 300 Yes No No
Y 101 200 Yes Yes No
Y 200 300 No No Yes
Z 1 50 Yes Yes Yes

使用 GNU awkPROCINFO变量来控制数组遍历按排序顺序。

相关内容