我想转置此数据:
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 :(得分: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