- 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消失。