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

  • 本文关键字:字段 文件 转置 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 '
      !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

awk救援!

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

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 ""}}

最新更新