Compare dois arquivos pela primeira coluna. Manter linhas se corresponder a [fechado]

0

Oi,

Eu tenho dois arquivos csv: Arquivo1 (aproximadamente 18800 linhas):

            p1  p10 p16 p19 p25 p3  p5  p6  p8  p9
    A3      567 0   3   0   18  17  8   4   6   7
    B23     490 7   6   2   23  26  20  14  12  29
    A56     737 1   4   1   6   4   1   4   8   5
    Z56     145 6   4   0   11  17  5   9   22  11
    D89     68  0   0   34  4   0   0   0   0   0
    A12     46  0   0   8   0   0   0   0   0   0
    A15     72  0   0   8   0   1   0   0   0   0
    D4      40  0   0   0   0   1   5   18  0   0
    Z6       7  0   1   0   1   1   10  1   2   0
    X3      49  0   0   125 0   0   0   0   0   0

Arquivo2 (400 linhas)

        name    tax price class order 

        B23      kat 35    2      1
        Z56      mat 26    3      2
        D4       kat 26    4      1

Agora, gostaria de comparar esses dois arquivos pela primeira coluna. Se o valor no segundo arquivo estiver presente no primeiro arquivo, eu gostaria de manter toda a linha correspondente. Abaixo um exemplo de uma saída:

            p1  p10 p16 p19 p25 p3  p5  p6  p8  p9
    B23     490 7   6   2   23  26  20  14  12  29
    Z56     145 6   4   0   11  17  5   9   22  11
    D4      40  0   0   0   0   1   5   18  0   0

Editar: File1 cat

    "","p1","p10","p16","p19","p25","p3","p5","p6","p8","p9"
"p1_1_length_2509_cov_19.337112",567,0,3,0,18,17,8,4,6,7
"p1_10_length_1072_cov_559.052910",4900,7,6,2,23,26,20,14,12,29
"p1_11_length_1032_cov_5800.211050",73784,1,4,1,6,4,1,4,8,5
"p1_12_length_1022_cov_10156.344134",145873,6,4,0,11,17,5,9,22,11
"p1_13_length_946_cov_7.164835",77,17936,61876,5257,6085,196,8383,24956,4656,14687
"p1_14_length_921_cov_15.662469",68,0,0,34,4,0,0,0,0,0
"p1_16_length_800_cov_7.126300",46,0,0,8,0,0,0,0,0,0
"p1_17_length_758_cov_12.328051",72,0,0,8,0,1,0,0,0,0
"p1_19_length_722_cov_5.621849",40,0,0,0,0,1,5,18,0,0

File2 cat:

name,superkingdom,phylum,class,order,family,genus,species
p10_1003_length_529_cov_12.940299,Viruses,,,,Poxviridae,Alphaentomopoxvirus,Anomala cuprea entomopoxvirus
p10_1021_length_525_cov_6.801508,Viruses,,,Herpesvirales,Alloherpesviridae,Batrachovirus,Ranid herpesvirus 1
p10_1047_length_521_cov_4.852792,Viruses,,,,,,Hudisavirus sp.
p10_1152_length_501_cov_22.430481,Viruses,,,,Mimiviridae,Cafeteriavirus,Cafeteria roenbergensis virus
p10_139_length_1152_cov_892.463415,Viruses,,,,,,Hudisavirus sp.
p10_149_length_1130_cov_7.540379,Viruses,,,Picornavirales,Picornaviridae,Enterovirus,Enterovirus C
    
por k_a_r_o_l 18.06.2018 / 14:07

2 respostas

1

Você deseja extrair todas as linhas do primeiro arquivo cuja primeira coluna corresponda a uma coluna no segundo arquivo.

Como o primeiro arquivo parece conter apenas texto em sua primeira coluna (e o resto são números), poderíamos simplesmente usar grep para isso.

Em bash ou qualquer outro shell que entenda substituições de processos, isso seria uma questão de

grep -F -f <( awk -F, 'NR > 1 { print $1 }' <file2 ) file1 >newfile

Em outros shells, você deve primeiro gravar a saída do comando awk em um arquivo temporário e usá-lo com grep -f .

O awk geraria saída como

p10_1003_length_529_cov_12.940299
p10_1021_length_525_cov_6.801508
p10_1047_length_521_cov_4.852792
p10_1152_length_501_cov_22.430481
p10_139_length_1152_cov_892.463415
p10_149_length_1130_cov_7.540379

e o grep usaria esses padrões de sequência fixa para corresponder a cada linha no seu primeiro arquivo.

Você poderia fazer tudo em awk também, o que incluiria a leitura na primeira coluna do segundo arquivo primeiro, como chaves em uma matriz associativa e, em seguida, testando a primeira coluna do primeiro arquivo com relação a essas chaves:

awk -F, 'NR==FNR && FNR>1 { keys[sprintf("\"%s\"", $1)] }
         NR!=FNR && FNR>1 && ($1 in keys)' file2 file1

O estranho sprintf() está lá porque a primeira coluna em file1 tem aspas duplas. Apenas adiciona aspas duplas aos dados lidos de file2 .

O FNR>1 ignora os cabeçalhos de ambos os arquivos, enquanto NR==FNR é verdadeiro, se estivermos lendo file2 .

    
por 18.06.2018 / 19:00
0

Este é um trabalho mais adequado para uma linguagem de programação, em vez de uma linguagem de script, porque você não está apenas trabalhando com um fluxo. Um algoritmo básico seria:

  1. Leia o primeiro arquivo, linha por linha. Construa uma lista de todos os primeiros elementos. (Dependendo do idioma que você usa, um hash ou dict pode ser mais eficiente.)
  2. Leia o segundo arquivo, linha por linha. Se o primeiro elemento existir na lista de # 1, salve-o no arquivo de saída.
por 18.06.2018 / 14:16

Tags