Combinando vários arquivos de dados com cabeçalho ao mesmo tempo que adiciona uma coluna de dados

0

Eu tenho vários arquivos de dados delimitados por tabulações que são separados por mês no formato jan06.txt, feb06.txt, ..., dec07.txt .

Dentro de cada arquivo, parece algo como:

Header1 Header2 Header3 ...
Data1   Data2   Data3   ...
Data4   Data5   Data6   ...
...     ...     ...

O que eu quero fazer é combinar todos os arquivos de dados em um único arquivo de dados, com apenas um cabeçalho no topo, mas também incluir uma nova coluna de dados que contém o mês e o ano para que eu não perca essa informação do nome do arquivo. Então, meu novo arquivo de dados único conteria:

Date   Header1 Header2 Header3 ...
200601 Data1   Data2   Data3   ...
200602 Data4   Data5   Data6   ...
...    ...     ...     ...

Onde 200601 se referiria a 06 de janeiro, 200602 se referem a 06 de fevereiro, etc.

Eu sei que se eu fizer algo como cat *.txt > data.txt , eu poderia combinar todos os meus arquivos. No entanto, as duas questões permanecem:

  1. Eu tenho um cabeçalho em todos os arquivos que seriam concatenados, o que eu não quero.
  2. eu perderia as informações do mês armazenadas no nome do arquivo.

Acho que posso fazer isso com uma combinação de cat e sed , mas não sei como começar.

    
por user1027169 02.02.2013 / 00:13

1 resposta

0

Aqui está um programa do awk que deve fazer o que você precisa:

awk '
    BEGIN {
        # create an array so we can map the month number to month name
        split("jan feb mar apr may jun jul aug sep oct nov dec", months)
    }
    function filename2date(filename,         month, year, i) {
        month = substr(filename, 1, 3)
        year = substr(filename, 4, 2)
        for (i=1; i<=12; i++) 
            if (months[i] == month) 
                return sprintf("20%s%02d", year, i)
        return filename
    }
    NR == 1  { 
        # this is the first line of the first file
        print "Date", $0 
    }
    FNR == 1 { 
        # this is the first line of each file
        date = filename2date(FILENAME)
        next
    }
    { print date, $0 }
' ???[0-9][0-9].txt > data.txt
    
por 02.02.2013 / 03:29