2017-10-19 3 views
0

Ich mag würde diese Daten transponieren:transponierenden Daten durch Teilen

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 

die gewünschte Ausgangs:

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

Der Code i versucht:

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

Das Problem ist, dass es sich umsetzt die ganzen Daten

+0

es ist wahrscheinlich besser beschrieben als: "verketten letzte Feld basierend auf ersten beiden Felder" – karakfa

Antwort

0

awk zur Rettung!

$ 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

Im Fall, dass Sie die Ausgabe, um die gleiche wie input_file erster und zweiter Ordnung der Datei dann folgenden können Sie in derselben helfen.

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 

Die Ausgabe wird wie folgt sein.

ZA 1 A_A A_T A_A A_T 
ZA 10 A_A A_A A_A A_A 
+2

Vorschlag: Setzen Sie 'Schlüssel = $ 1 FS $ 2' einmal und verwenden Sie es stattdessen. – karakfa

0

Da diese Frage ursprünglich 'perl' auch getaggt wurden:

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 

Produziert:

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