转置文件并填写缺少的字段

时间:2017-11-06 22:05:17

标签: awk

我已经尝试了几个awk和sed命令以及GNU datamash来改变格式并将缺少的字段编码为" ??"这个数据文件没有成功。我有一个文件格式如下:

ind_1      SNP_1    AA
ind_1      SNP_2    AB
ind_1      SNP_3    AA
ind_2      SNP_1    AA
ind_2      SNP_2    AA
ind_3      SNP_1    AB
ind_3      SNP_2    AA
ind_3      SNP_3    AB
ind_3      SNP_4    AA

所需格式:

            SNP_1      SNP_2    SNP_3      SNP_4
  ind_1      AA       AB       AA         ??
  ind_2      AA       AA       ??         ??
  ind_3      AB       AA       AB         AA

我首先尝试使用GNU datamash

      datamash --no-strict transpose < input1.txt

然后我尝试了这个awk:

 awk '
      !b[$1 FS $2]++{
    a[++i]=$1 FS $2
    }
    {
   c[$1 FS $2]=c[$1 FS $2]?c[$1 FS $2] FS $4:$4
        }
   END{
for(k=1;k<=i;k++){
  print a[k],c[a[k]]
 }}
'   Input1_txt

1 个答案:

答案 0 :(得分:0)

awk救援!

使用真正的多维数组会更容易,但这适用于大多数awk s

awk -v OFS='\t' '{vals[$1]; cols[$2]; a[$1,$2]=$3} 
             END {for(j in cols) printf "%s", OFS j; 
                  print "";
                  for(i in vals) 
                    {printf "%s", i; 
                     for(j in cols) printf "%s", OFS (((i,j) in a)?a[i,j]:"??"); 
                     print ""}}