2017-10-19 62 views
0

我想转置该数据变调数据

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

问题在于它转换整个数据

+0

它可能更好地描述为: “串连最后一个字段基于前两个字段” – karakfa

回答

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

建议:设置'key = $ 1 FS $ 2'一次并改为使用它。 – karakfa

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