按部分转置数据

时间:2017-10-19 18:14:39

标签: awk transpose

我想转置此数据

ZA 1 snp10000-652219   A_A
ZA 1 snp10001-703514   A_T
ZA 1 snp10002-766996   A_A
ZA 1 snp10003-808120   A_T
ZA 10 snp10000-652219   A_A
ZA 10 snp10001-703514   A_A
ZA 10 snp10002-766996   A_A
ZA 10 snp10003-808120   A_A

所需的输出:

ZA 1    A_A  A_T A_A A_T
ZA 10   A_A  A_A A_A A_A

我试过的代码:

      awk '
   { 
      for (i=1; i<=NF; i++)  {
        a[NR,i] = $i
       }
     }
     NF>p { p = NF }
    END {    
           for(j=1; j<=p; j++) {
           str=a[1,j]
            for(i=2; i<=NR; i++){
          str=str" "a[i,j];
              }
            print str
                 }
         }'

问题在于它转置了整个数据

3 个答案:

答案 0 :(得分:0)

awk救援!

$ awk '{k=$1 FS $2; a[k]=a[k] FS $NF} 
   END {for(k in a) print k a[k]}' file | sort

ZA 1 A_A A_T A_A A_T
ZA 10 A_A A_A A_A A_A

答案 1 :(得分:0)

如果您需要与Input_file的第一个和第二个文件的订单相同的输出订单,那么以下内容可以帮助您。

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]]
}}
'   Input_file

输出如下。

ZA 1 A_A A_T A_A A_T
ZA 10 A_A A_A A_A A_A

答案 2 :(得分:0)

因为这个问题最初也被标记为'perl':

perl -ane '
    {
        if(defined($previous) and "@F[0,1]" ne $previous) {
            printf("% -7s %s\n",$previous,"@col_d");
            @col_d=()
        }
        push(@col_d,$F[-1]);
        $previous="@F[0,1]"
    }
    END {
        printf("% -7s %s\n",$previous,"@col_d")
    }
' file

产地:

ZA 1    A_A A_T A_A A_T
ZA 10   A_A A_A A_A A_A