como mesclar arquivos diferentes que tenham o mesmo cabeçalho, mas um nome de arquivo ligeiramente diferente?

1

Eu tenho um problema ao mesclar arquivos para um grande conjunto de dados, como abaixo. Eu quero que você me ajude a me deixar saber o roteiro que pode fazer tal tarefa.

nome bonito: fluxes_year_lat_long Eu tenho 30 anos de arquivos diários de fluxo para mais de 100 locais (lat_long) Quero mesclar do ano 1 ao ano 30 de cada arquivo de ponto.

meu arquivo se parece com isso

nome do arquivo1: fluxes_2000_50_70

2000 1 1 5000 ....
2000 1 2 2000 ....
.
.
.
2000 12 31 5000
YYYY M D Fluxes

nome do arquivo2: fluxes_2001_50_70

2001 1 1 5000
YYYY M D Fluxes
.
.
.

até:

nome do arquivo30: fluxes_2030_50_70

2030 1 1 5000
YYYY M D Fluxes
.
.
.

O número de linhas para cada arquivo é o mesmo.

Eu quero que a saída esteja mesclando os fluxos diários do ano 2000 para 2030 para cada ponto localização como

arquivo de saída: fluxes_lat_long

YYYY MM DD Fluxes value.

Além disso, quero que o script leia e mescle o arquivo começando com o nome fluxes_. Eu aprecio sua resposta.

    
por AiB 21.08.2013 / 19:32

5 respostas

1

Eu acho que você está perguntando quais arquivos:

fluxes_2000_10_10   fluxes_2001_10_10    fluxes_2003_10_10

e

fluxes_2000_20_10   fluxes_2001_20_10    fluxes_2003_20_10

Você cria um arquivo "total" para cada um dos arquivos acima na latitude 10_10 e, em seguida, 20_10, etc.

Nesse caso:

bash$ for lat in $(ls -1 fluxes_* | sed 's/fluxes_[0-9]*_\([0-9]*_[0-9]*\)//' |sort|uniq )
do 
    echo "processing $lat ..." 
    cat fluxes_[0-9]*_${lat} > fluxes_TOT_${lat} 
done 

ls -1 fluxes_* | sed 's/fluxes_[0-9]*_\([0-9]*_[0-9]*\)//' | sort | uniq localiza todos os pares de números de latitudes exclusivas (x_y), em seguida, percorremos eles com um for loop e cat o conteúdo dos arquivos nessa latitude (todos os anos) e os envia para fluxes_TOT_x_y .

    
por 21.08.2013 / 20:03
1

Eu usaria sort -u fluxes_* _lat_long > fluxes_lat_long ', é de longe a solução mais simples.

EDIT: use em um script

for file in $(ls -1 fluxes_20*_*_*) ; do
    export ll="$(echo $file |cut -d _ -f 3,4)"  # extract lat & long
    echo "sort -u fluxes_*_$ll"  "> fluxes_$ll" # create sort instruction
done | uniq | sh
    
por 22.08.2013 / 01:09
1

Se eu entendi seus requisitos, você deseja mesclar todos os dados de fluxo para um ponto em fluxes_lat_long com o formato

01 01 Fluxes total_fluxes_for_Jan_1_over_30_years
01 02 Fluxes total_fluxes_for_Jan_2_over_30_years
...

Se for esse o caso, aqui está um script em Perl que deve ajudar:

#!/usr/bin/perl

use strict;
use warnings;

my @files = glob 'fluxes_*_*_*';
my %points;
$files[$_] =~ /_([0-9]+_[0-9]+)\Z/ and $points{$1}++ for (0..$#files);

for my $point (sort keys %points){
    my @point_files = grep { /_$point\Z/ } @files;
    my %days;
    for my $file (@point_files){
        open my $f,'<',$file or die "Failed to open file $file : $!\n";
        <$f>; #Discard the header
        while(<$f>){
            my ($year,$month,$day,$number) = split;
            $days{"$month $day"}+=$number;
         }
         close $f;
     }

     open my $of,'>',"fluxes_$point";
     for (sort by_date keys %days){
         print $of "$_ Fluxes $days{$_}\n";
     }
 }

 sub by_date{
    my ($month_a,$day_a) = split /\s*/,$a;
    my ($month_b,$day_b) = split /\s*/,$b;
    my $month_sort = $month_a <=> $month_b;
    my $day_sort = $day_a <=> $day_b;
    return $month_sort ? $month_sort : $day_sort
}
    
por 25.08.2013 / 15:23
0

Se você quiser concatenar, pode fazê-lo facilmente:

cat fluxes_2001_50_70 >> fluxes_2000_50_70

Mas você faz isso quando seus arquivos não aumentam seu volume.

No entanto, sua pergunta está por trás do conjunto de outras perguntas, como:

"segundo arquivo deve ser atualizado após a fusão?"

    
por 21.08.2013 / 19:55
0

tail -qn +2 removerá os cabeçalhos e iniciará a partir da segunda linha para cada arquivo, fluxes_* irá globar todos os arquivos iniciados com essa sequência e > fluxes_2000_2030 enviará todos os dados para um único arquivo de saída:

tail -qn +2 fluxes_* > fluxes_2000_2030
    
por 21.08.2013 / 20:03

Tags