在perl

时间:2016-10-13 20:44:21

标签: perl

我正在使用一些相当大的数据文件 - 每个90012行。每个文件包含一年中每天7,501个气象站的天气数据。每个气象站有12条线路,每个月一条。下面的数据样本(截断以显示每个月只有三天)。

我想编写一个perl脚本,将每个气象站的所有12条线连接到一条线上,以便于后期处理。非常感谢任何帮助。

AQW00061705 01      824C   824C   824C
AQW00061705 02      826C   826C   826C
AQW00061705 03      829C   829C   829C
AQW00061705 04      826C   826C   826C
AQW00061705 05      821C   821C   821C
AQW00061705 06      813C   813C   813C
AQW00061705 07      806C   805C   805C
AQW00061705 08      801C   801C   801C
AQW00061705 09      807C   807C   808C
AQW00061705 10      812C   812C   812C
AQW00061705 11      816C   816C   817C
AQW00061705 12      823C   823C   823C
CAW00064757 01      204Q   202Q   200Q

3 个答案:

答案 0 :(得分:2)

perl -ape 'chomp if $. % 12; $G && s/^$G//; $G=$F[0]' file

删除除每12个换行符之外的换行符。如果第一个字段与上一行的第一个字段相同,则删除它。

早先的建议:

perl -pe 'chomp if $. % 12' file

答案 1 :(得分:1)

#!/usr/bin/env perl

use strict;
use warnings;

my %station;
while(my $line = <>) {
    my ($id, undef, @day_data) = split(' ', $line);
    push @{$station{$id}}, @day_data;
}

foreach my $sid (sort keys %station) {
    print $sid, ' ', join(' ', @{ $station{$sid} }), "\n";
}

然后

./script.pl your_wheather_file        

给出以下输出:

AQW00061705 824C 824C 824C 826C 826C 826C 829C 829C 829C 826C 826C 826C 821C 821C 821C 813C 813C 813C 806C 805C 805C 801C 801C 801C 807C 807C 808C 812C 812C 812C 816C 816C 817C 823C 823C 823C
CAW00064757 204Q 202Q 200Q

答案 2 :(得分:0)

试试这个(单行):

perl -lne '
    $. % 12 == 0 and print "";
    printf("%s ", $_);
' file

就使用默认的逐行模式而言,使用此处理BIG文件并将输出重定向到新文件应该不是问题。

使用

awk 'NR%12==0{print ""} {printf("%s ", $0)}' file