Awk 根据行集合对数据进行分组

Awk 根据行集合对数据进行分组,awk,Awk,在第一列中有一个从5.0到12的值(每行增量为.5),我称之为set,在每行的from中有5列带有值 目的是为了找到每个集合(5.0到12.0),将所有集合的2列添加到单个集合中,并添加到相同的案例中,直到文件结束 因此,输出将是4列的组(1列+3组中的3列) 输入文件 5.0 0 0 0 128 128 5.5 3 69 18 128 128 6.0 2 79 12 63 15 6.5 -1 75 11 28 24 7.0 0

在第一列中有一个从5.0到12的值(每行增量为.5),我称之为set,在每行的from中有5列带有值

目的是为了找到每个集合(5.0到12.0),将所有集合的2列添加到单个集合中,并添加到相同的案例中,直到文件结束

因此,输出将是4列的组(1列+3组中的3列)

输入文件

5.0     0   0   0 128 128
5.5     3  69  18 128 128
6.0     2  79  12  63  15
6.5    -1  75  11  28  24
7.0     0  73  12  32  27
7.5    -1  73  11  35  21
                         
5.0     0   0   0 128 128
5.5     3  69  18 128 128
6.0     1  79  12  61  18
6.5    -1  75  11  28  25
7.0     0  73  11  31  28
7.5    -2  73   9  32  19

5.0     0   0   0 128 128
5.5     3  69  18 128 128
6.0     1  79  12  51  15
6.5    -2  74  12  26  22
7.0    -1  72  11  25  21
7.5    -1  71  11  28  12
#!/usr/bin/perl
use strict;
use warnings;

my @id;
my %data;
my $set = 0;

while(<>) {
    unless (/^\d/) { ++$set; next }
    my ($id, @fields) = (split)[0..5];
    push @id, $id unless $set;
    for my $f (0..$#{fields}) {
        push @{$data{$id}[$f]}, $fields[$f];
    }
}

for my $t (0..4) {
    for my $i (@id) {
        my $p  = shift @{$data{$i}};
        print join (",", $i, @{$p})."\n";
    }
    print "\n";
}
所需输出

5.0   0   0   0   
5.5   3   3   3   
6.0   2   1   1   
6.5 - 1  -1  -2   
7.0   0   0  -1   
7.5 - 1  -2  -1   
                   
5.0   0   0   0   
5.5  69  69  69   
6.0  79  79  79   
6.5  75  75  74   
7.0  73  73  72   
7.5  73  73  71     
                  
5.0   0  0   0    
5.5  18 18  18    
6.0  12 12  12    
6.5  11 11  12    
7.0  12 11  11    
7.5  11  9  11      
                  
5.0  128  128  128
5.5  128  128  128
6.0   63   61   51
6.5   28   28   26
7.0   32   31   25
7.5   35   32   28
                  
5.0  128  128  128
5.5  128  128  128
6.0   15   18   15
6.5   24   25   22
7.0   27   28   21
7.5   21   19   12
我有珍珠的解决方案,但我想做同样的awk

这里是我的代码

5.0     0   0   0 128 128
5.5     3  69  18 128 128
6.0     2  79  12  63  15
6.5    -1  75  11  28  24
7.0     0  73  12  32  27
7.5    -1  73  11  35  21
                         
5.0     0   0   0 128 128
5.5     3  69  18 128 128
6.0     1  79  12  61  18
6.5    -1  75  11  28  25
7.0     0  73  11  31  28
7.5    -2  73   9  32  19

5.0     0   0   0 128 128
5.5     3  69  18 128 128
6.0     1  79  12  51  15
6.5    -2  74  12  26  22
7.0    -1  72  11  25  21
7.5    -1  71  11  28  12
#!/usr/bin/perl
use strict;
use warnings;

my @id;
my %data;
my $set = 0;

while(<>) {
    unless (/^\d/) { ++$set; next }
    my ($id, @fields) = (split)[0..5];
    push @id, $id unless $set;
    for my $f (0..$#{fields}) {
        push @{$data{$id}[$f]}, $fields[$f];
    }
}

for my $t (0..4) {
    for my $i (@id) {
        my $p  = shift @{$data{$i}};
        print join (",", $i, @{$p})."\n";
    }
    print "\n";
}
#/usr/bin/perl
严格使用;
使用警告;
我的@id;
我的%数据;
我的$set=0;
while(){
除非(/^\d/){++$set;next}
我的($id,@fields)=(分割)[0..5];
推送@id,$id,除非$set;
对于我的$f(0..$#{fields}){
推送{$data{$id}[$f]},$fields[$f];
}
}
对于我的$t(0..4){
我的$i(@id){
my$p=shift@{$data{$i};
打印联接(“,”,$i,@{$p})。“\n”;
}
打印“\n”;
}
请将伟大的csv格式的文件


提前感谢您在gnu awk中使用多维数组


awk'FNR==1 | |!NF{++n}n==1{key[++k]=$1}{for(i=2;i在
gnu-awk
中使用多维数组:


awk'FNR==1 | |!NF{++n}n==1{key[++k]=$1}{for(i=2;iDear Anubhava由于某些原因无法工作。检查此在线工作演示:亲爱的Abubhava在第一列中以0.5开头的原始文件您修改的输入具有以
5.0
开头的第一条记录,代码工作正常..我在mi文件中发现错误亲爱的Anubhava由于某些原因无法工作。检查此工作在线演示:尊敬的Abubhava,原始文件以0.5开头,您修改的输入以
5.0
开头,有第一条记录,代码运行正常..我在mi文件中发现了错误