Agrupar arquivos delimitados por tabulação

3

Eu quero comparar as informações dos arquivos de mapeamento para recuperar informações reticuladas em um formato de arquivo delimitado por tabulação.

Por exemplo, um arquivo contém

COG0001 882.DVU3168
COG0002 883.DvMF_2502
COG0001 1140.Synpcc7942_0645
COG0001 1148.SYNGTS_2220

O outro arquivo

COG0001 H
COG0002 E

O arquivo final deve conter as seguintes informações:

COG0001 882.DVU3168 H
COG0002 883.DvMF_2502   E
COG0001 1140.Synpcc7942_0645    H
COG0001 1148.SYNGTS_2220    H

EDITAR

Voltando à minha pergunta, também gostaria de imprimir informações do arquivo 2 para o arquivo 3.

Meu comando é:

awk -F $'\t' 'FNR==NR{a[$2]++;next}a[$1]''{print $0, ..... }' file2 file1 > file3

Isso me daria tudo do arquivo1 com base no que corresponde à coluna 2 (arquivo2) para a coluna 1 (arquivo1).

Como definir para que eu possa também imprimir informações do arquivo 2?

    
por BSP 09.08.2014 / 16:20

2 respostas

6

Com awk você poderia fazer assim:

$ awk 'NR==FNR{a[$1]=$2;next}{print $0, a[$1]}' file2 file1
COG0001 882.DVU3168 H
COG0002 883.DvMF_2502 E
COG0001 1140.Synpcc7942_0645 H
COG0001 1148.SYNGTS_2220 H

O bloco NR==FNR{a[$1]=$2;next} é executado para o arquivo2 e armazena o segundo campo em um mapa, usando o primeiro campo como uma chave.

O bloco {print $0, a[$1]} é executado para o arquivo1 e imprime a linha atual, seguida pelo valor recuperado do mapa.

Se você quiser que os dados sejam delimitados por tabulações (com outros espaços em branco que não delimitam os campos), você pode executar awk -F'\t' ... e, se desejar também a guia de saída delimitada, use awk -F'\t' -v OFS='\t' ... .

    
por 09.08.2014 / 16:26
1

Se você não se importa com a ordem de saída:

$ join <(sort file1) <(sort file2)
COG0001 1140.Synpcc7942_0645 H
COG0001 1148.SYNGTS_2220 H
COG0001 882.DVU3168 H
COG0002 883.DvMF_2502 E
    
por 09.08.2014 / 17:18