我正在使用一些相当大的数据文件 - 每个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
答案 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:
awk 'NR%12==0{print ""} {printf("%s ", $0)}' file