aydj
1
i have a file like this:
wedd01A1 1
wedd01A2 2
wedd01A3 1
wedd02A2 3
wedd02A3 4
wadd02A1 1
wadd02A2 5
wqdd01A1 3
wsdd01A3 1
i want out like this:
A1 A2 A3
wedd01 1 2 1
wedd02 0 3 4
wadd02 1 5 0
wqdd01 3 0 0
wsdd01 0 0 1
kindly help!
Here's one way to do it with Perl -
$
$
$ cat -n f0
1 wedd01A1 1
2 wedd01A2 2
3 wedd01A3 1
4 wedd02A2 3
5 wedd02A3 4
6 wadd02A1 1
7 wadd02A2 5
8 wqdd01A1 3
9 wsdd01A3 1
$
$ ##
$ perl -lane 'BEGIN {@h=qw(A1 A2 A3)}
> $y{$F[0]}=$F[1]; @x=unpack("A6A2",$F[0]);
> if ($x[0] ne $prev){push @a,$x[0]} $prev=$x[0];
> END {
> printf("%6s %3s %3s %3s\n","",@h);
> foreach (@a){
> printf("%6s %3s %3s %3s\n",
> $_,
> defined $y{$_.$h[0]} ? $y{$_.$h[0]} : "0",
> defined $y{$_.$h[1]} ? $y{$_.$h[1]} : "0",
> defined $y{$_.$h[2]} ? $y{$_.$h[2]} : "0"
> )
> }}' f0
A1 A2 A3
wedd01 1 2 1
wedd02 0 3 4
wadd02 1 5 0
wqdd01 3 0 0
wsdd01 0 0 1
$
$
Note that I have assumed the header columns "A1", "A2", "A3" to be constant (they are hard-coded in the script).
tyler_durden
frans
3
working bash script (can probably be optimized) :
#!/bin/bash
Init() { A1=0; A2=0; A3=0; }
Init
echo -e "\tA1\tA2\tA3"
while read L1 L2
do
LIN=${L1:0:6}
COL=${L1:6:2}
[ -z "$COL" ] && continue
OLD=${OLD:-$LIN}
if [ "$LIN" != "$OLD" ]
then
echo -e "$OLD\t$A1\t$A2\t$A3"
Init
OLD=$LIN
fi
eval "$COL=\$L2"
done < infile
aydj
4
Thanks for the answers, is it possible with awk?
awk '{x=substr($1,1,6);y=substr($1,7,2);a[x FS y]=$2;b[y]=0;c[x]=0}
END {
{for (i in b) printf "\t%s", i}; {print ""};
{for (i in c) { printf i;
{ for (j in b) printf "\t%s",(a[i FS j]=="")?"0":a[i FS j] }
print "";}
}
}' urfile
A1 A2 A3
wqdd01 3 0 0
wsdd01 0 0 1
wadd02 1 5 0
wedd01 1 2 1
wedd02 0 3 4
while(<DATA>){
chomp;
if(/^(.*)(A[0-9]+)\s*(.*)$/){
$hash{$1}->{$2}=$3;
}
}
print " A1 A2 A3\n";
foreach my $key(keys %hash){
my $t1=($hash{$key}->{A1})?$hash{$key}->{A1}:0;
my $t2=($hash{$key}->{A2})?$hash{$key}->{A2}:0;
my $t3=($hash{$key}->{A3})?$hash{$key}->{A3}:0;
print $key," ",$t1," ",$t2," ",$t3,"\n";
}
__DATA__
wedd01A1 1
wedd01A2 2
wedd01A3 1
wedd02A2 3
wedd02A3 4
wadd02A1 1
wadd02A2 5
wqdd01A1 3
wsdd01A3 1
aydj
7
Thanks rdcwayx , i have this error if i try to run it
awk: syntax error near line 5
awk: illegal statement near line 5