Grep que mostra a linha do padrão e a linha correspondente

4

Suponha que eu tenha esses dois arquivos:

1.

Locus_1 univ
Locus_2 anc
Locus_3 cat

2.

university  GO:000001
impromptu   GO:000002
advanced    GO:000003
inheritance GO:000004

Eu quero fazer um grep -f dos $ 2 do arquivo # 1 no arquivo # 2, mas também quero recuperar as linhas do primeiro arquivo e toda a linha do arquivo # 2 que corresponde a $ 2 do arquivo # 1 .

Basicamente, quero que minha saída seja assim

Locus_1 univ university GO:000001
Locus_2 anc  advanced   GO:000003

Como posso fazer isso? Eu pensei que poderia analisar o primeiro arquivo linha por linha com um for ciclo e, em seguida, armazenar a linha em uma variável, mas não consegui ter êxito.

Eu uso um shell Cygwin para Windows.

    
por LinuxBlanket 31.05.2016 / 12:40

1 resposta

9

Salve isso em um arquivo, digamos patterns.awk , em seguida, chame awk -f patterns.awk patterns data , onde patterns é seu primeiro arquivo e data o segundo:

NR == FNR {
    prefix[NR] = $0;
    pattern[NR] = $2;
    count++;
    next;
}

{
    for (i = 1; i <= count; i++) {
        if (index($1, pattern[i]) > 0) {
            print prefix[i] " " $0;
            next;
        }
    }
}

Isso funciona da seguinte maneira: A primeira regra é usada enquanto lemos o arquivo padrão, ou seja, enquanto o número total de registros é igual ao número de registros no arquivo. Ele salva a linha e o padrão para procurar em dois arrays e continua. A segunda regra é usada assim que o número total de registros excede o número de registros no arquivo, ou seja, enquanto estamos lendo o arquivo de dados. Ele verifica se algum dos padrões corresponde à primeira coluna da linha. Em caso afirmativo, imprime a linha correspondente do arquivo padrão e, em seguida, a linha correspondente do arquivo de dados.

    
por 31.05.2016 / 12:57