Mesclar e anexar colunas para mais de dois arquivos

3

eutem"N" número de arquivos com o conteúdo mostrado na imagem, e eu quero mesclar e acrescentar a quinta coluna

Os arquivos são separados por tabulações.

Eu tenho "N" número de arquivos cujo conteúdo é mostrado na captura de tela acima. Eu quero mesclá-los e acrescentar a quinta coluna. As primeiras 4 colunas são as mesmas.

Eu tentei com o comando awk abaixo para os arquivos 1 e 2:

awk 'NR==FNR{a[NR]=$0;next} {print a[FNR] "\t",$5}' file1 file2

só acrescenta 2 arquivos, não mais que 2.

Como posso fazer isso corretamente usando awk , paste ou outras ferramentas?

    
por Kiran 31.12.2015 / 12:27

2 respostas

2

Se as quatro primeiras colunas forem idênticas nos arquivos, você poderá executar algo como

set -- file*
fields="-f-5,$(seq -s, 10 5 $((5*$#)))"
paste "$@" | cut ${fields%?} >outfile

Isso fará com que paste de todos os arquivos extraiam os campos de 1 a 5 e a cada 5 depois do campo.

    
por 31.12.2015 / 14:28
2

Sem teste:

awk -F "\t" '
    { key = $1 FS $2 FS $3 FS $4; values[key] = values[key] FS $5 }
    END { for (key in values) print key values[key] }
' file ...

O cabeçalho

Para cada arquivo, você deseja extrair parte do nome do arquivo e usá-lo como cabeçalho. Manteremos o controle do cabeçalho com uma string separada, anexando-o a cada arquivo.

awk -F "\t" '
    BEGIN { header = "col1" FS "col2" FS "col3" FS "col4" }
    { 
        key = $1 FS $2 FS $3 FS $4
        values[key] = values[key] FS $5 
    }
    FNR == 1 { 
        split(FILENAME, a, /_/)
        header = header FS a[2] 
    }
    END { 
        print header
        for (key in values) 
            print key values[key] 
    }
' file ...

Inicializamos o cabeçalho no bloco BEGIN. Dê as primeiras 4 colunas, quaisquer títulos de cabeçalho que você precisar.

A variável FNR é o número do registro do arquivo atual. Quando FNR == 1 estamos na primeira linha deste arquivo. A variável awk FILENAME contém o nome do arquivo atualmente sendo processado.

Classificando

Se você usar o GNU awk, poderá fazê-lo no bloco END ( referência ):

    END { 
        print header
        # order the array by index, as strings, ascending
        PROCINFO["sorted_in"] = "@ind_str_asc"
        for (key in values) 
            print key values[key] 
    }

Se você não tem o GNU awk, você pode fazer isso:

awk '...' | {
    read header
    echo "$header"
    sort
}
    
por 31.12.2015 / 13:24