文本:- A 001 10
-
A 002 20
-
A 003 30
-
B 004 40
-
B 005 50
-
C 006 60
-
C 007 70
-
D 008 80
-
E 009 90
-
E 010 100
要想得到的结果:
- A AA B BB C CC D DD E EE
-
001 10 004 40 006 60 008 80 009 90
-
002 20 005 50 007 70 010 100
-
003 30
perl 的代码(先贴下):
- #!/usr/bin/perl
-
use warnings;
-
use strict;
- my (%a,%b,%c);
-
my $ml=0;
- open (TEST,") or die "can't open file a";
-
while(<TEST>){
-
my($c1,$c2,$c3)=split;
-
$c{$c1}++;
-
$a{$c1,$c{$c1}}=$c2;
-
$b{$c1 x 2,$c{$c1}}=$c3;
-
$ml=$ml>$c{$c1}?$ml:$c{$c1};
-
}
-
foreach (sort keys %c){
-
print $_,"\t";
-
print $_ x 2,"\t";
-
}
-
print "\n";
-
for (my $i=1;$i<=$ml;$i++){
-
foreach (sort keys %c){
-
unless($a{$_,$i}){
-
print "\t";
-
}else{
-
print $a{$_,$i},"\t";
-
}
-
unless ($b{$_ x 2,$i}){
-
print "\t";
-
}else{
-
print $b{$_ x 2,$i},"\t";
-
}
-
}
-
print "\n";
-
}
数据结构:
- $VAR1 = {
-
'E2' => '010',
-
'A2' => '002',
-
'E1' => '009',
-
'C2' => '007',
-
'D1' => '008',
-
'B1' => '004',
-
'A3' => '003',
-
'B2' => '005',
-
'C1' => '006',
-
'A1' => '001'
-
};
-
$VAR2 = {
-
'EE1' => '90',
-
'EE2' => '100',
-
'BB2' => '50',
-
'CC1' => '60',
-
'AA2' => '20',
-
'BB1' => '40',
-
'DD1' => '80',
-
'AA1' => '10',
-
'AA3' => '30',
-
'CC2' => '70'
-
};
-
$VAR3 = {
-
'A' => 3,
-
'D' => 1,
-
'C' => 2,
-
'E' => 2,
-
'B' => 2
-
};
简单说明:
awk 的代码:
- #!/bin/gawk -f
-
{
-
c[$1]++;
-
a[$1,c[$1]]=$2;
-
b[$1,$1,c[$1]]=$3;
-
ml=ml>c[$1]?ml:c[$1];
-
}
-
END{
-
n=asorti(c);
-
for(i=1;i<=n;i++)
-
{
-
printf "%s\t",c[i];
-
printf "%s%s\t",c[i],c[i];
-
}
-
printf "\n";
-
for(j=1;j<=ml;j++)
-
{
-
for(i=1;i<=n;i++)
-
{
-
if(a[c[i],j]){
-
printf "%s\t",a[c[i],j];
-
}else{
-
printf "\t";
-
}
-
if(b[c[i],c[i],j]){
-
printf "%s\t",b[c[i],c[i],j];
-
}else{
-
printf "\t";
-
}
-
}
-
printf "\n";
-
}
-
}
其实和perl一样 只是用awk的语法写了一遍。
说下思路:
因为从输出结果中看出来A,B...等重复了几行,及那个最大最后输出就有几行,这里用了ml记录最大行数。同时分别用hash a 和 b 存放第二个域与第三个域 接下来就是排序输出的问题了awk 和 perl用的函数不一样 分别是asorti 和 sort
这里asorti 和asort 要注意区别
前面是对index 进行排序。排完后index 变成1-n(n是返回值 即hash/数组元素个数) 值变成了原来的index,只不过这里已经排好序了。比如A在B前面 则a[1]=A a[2]=B 如果不想失去原来的hash的话 只要加一个目的hash就行了。
asorti(source_array,dest_array)
awk 会先将source_array 中的数组拷贝到dest_array 中去然后进行如上面所说的排序。asort 针对的是值的排序。排好好index 也变成1-n的形式
同样可以加dest_array 避免source_array 中的index消失。
阅读(2524) | 评论(0) | 转发(0) |