Input :-
Hd1;Hd2:hd3;Hd4;Hd5
X;1;2;3;4
Y;2;3;5;6
Z;3;5;6;7
X;10;11;24;16
Y;11;23;21;1
Z;10;13;14;15
X;0;1;2;0
K;0;0;0;0
K;0;0;0;0
I want Sum Data base on first column;
Hd1;Hd2:hd3;Hd4;Hd5
X;11;14;29;20
Y;12;26;26;7
Z;13;18;20;22
K;0;0;0;0
I Know how to do one Column but this input have multiples Column
awk '{for(i=1;i<=NF;i++){if(i==1){Q=$1} else {A[Q OFS i]+=$i}}} END{for(y in A){W=y;gsub(/[[:space:]].*/,X,W);while(p<=NF){D[W]=D[W] OFS A[W OFS p];p++};while(k<=NF){delete A[W OFS k];k++};p="";k=""} { for(t in D){print t OFS D[t]}}}' Data.txt
I have Change space with ;
The trick is to record which $1 values occur. Then you can use that to enumerate. Try:
awk '
NR==1 {
print
next
}
{
A[$1]
for(j=2;j<=NF;j++) T[$1,j]+=$j
}
END {
n=NF
for(i in A) {
$1=i
for(j=2; j<=n; j++) $j=T[i,j]
print
}
}
' FS=\; OFS=\; file
can we wright in one Line!
a bit verbose, but..
awk -f pare.awk FS=';' myFile.txt
where pare.awk
is:
FNR==1 {h=$0;next}
{
for (i=2;i<=NF;i++)
a[$1,i]+=$i
n[$1]
nf=NF
}
END {
print h
for(i in n) {
printf i FS
for(j=2;j<=nf;j++)
printf("%d%s", a[i,j], (j==nf)?ORS:FS)
}
}
---------- Post updated at 03:43 PM ---------- Previous update was at 03:41 PM ----------
why?