localize e imprima informações específicas com seu nome

-4

Eu tenho uma lista do arquivo de dados 1 que eu quero encontrar no arquivo 2, onde quero aplicar o padrão de correspondência ao seu nome. Não é necessário que cada nome consista em dados únicos. Pode ser comum entre os nomes.

Arquivo 1:

123_A7
456_B2
789_f5
111_L2

arquivo principal:

A   Edwin
B   777
B   123_A7
B   456_B2
A   Alex
B   453
B   678
A   Marwin
B   789
B   123_A7
B   111_L2
B   452

Saída desejada:

B   123_A7
A   Edwin
A   Marwin
B   456_B2
A   Edwin
B   111_L2
A   Marwin
    
por Rhea 21.09.2017 / 10:31

2 respostas

1

Você pode usar sed :

sed '/\s/{H;d;}
  G;s/\nB/#B/g
  s/^\(.*\)\(\n\n.*#\)\(B\s*\)/#/
  /^[^#]*\n/d
  :a;s/^\([^#]*\)\(#.*\n\)\(A[^#]*\)\([^\n]*#\)/#/;ta
  s/#\n.*//;y/#/\n/' main file1

Primeiro, leia o arquivo main para coletar os códigos de cada nome no espaço de espera (linha 1). Então, para cada linha de file1 acrescentar o espaço de espera, substitua as linhas novas antes de B linhas com # para facilitar a análise (linha 2) e pesquise com referências anteriores para os códigos correspondentes (linha 3). Apagar linhas sem correspondências (linha 4). Agora faça um loop para coletar os nomes para o padrão fornecido (linha 5). Por fim, imprima com o espaço restante restante removido e # convertido de volta para novas linhas (linha 6). (Nota: funciona apenas com o GNU sed )

    
por Philippos 21.09.2017 / 13:33
0

Eu usaria awk para isso:

awk 'NR==FNR{seen[$1];next} /^A/{NAME=$0}
    {for (x in seen){ if ($2==x)print $0"\n"NAME}}' file1 main

A saída é:

B   123_A7
A   Edwin
B   456_B2
A   Edwin
B   123_A7
A   Marwin
B   111_L2
A   Marwin

Acima está a impressão de IDs e Nome, se herdar esse ID, mas em separado. Aqui está o script completo para agrupar os nomes onde eles estão nos mesmos IDs.

awk -F'\t' '{a[$1]=a[$1]"\n"$2} END{for (i in a) print i""a[i]}' <(
    awk 'NR==FNR{seen[$1];next} 
        /^A/{NAME=$0}{for (x in seen){ if ($2==x)print $0"\t"NAME}
    }' file1 main)

A saída é:

B   111_L2
A   Marwin
B   456_B2
A   Edwin
B   123_A7
A   Edwin
A   Marwin
    
por devWeek 21.09.2017 / 17:38