como copiar uma coluna de outro arquivo quando as correspondências do ID

0

Eu tenho 2 arquivos,

head file1

    1   115258827   12 HG00099
    1   115258827   5 HG00100
    1   115258827   8 HG00101
    1   115258827   6 HG00103
    1   115258827   4 HG00108
    1   115258827   3 HG00110
    1   115258827   4 HG00111
    1   115258827   2 HG00114
    1   115258827   8 HG00115
    1   115258827   5 HG00116

e outro arquivo

head file2
HG00096 0|0
HG00097 0|0
HG00099 0|0
HG00100 0|1
HG00101 0|0
HG00102 0|0
HG00103 0|0
HG00105 0|0
HG00106 0|0
HG00107 0|0

Eu quero verificar se a última coluna do arquivo1 corresponde à primeira coluna do arquivo2, adicione a segunda coluna do arquivo 2 ao arquivo1, terminando com algo como

head desired
1   115258827   12 HG00099 0|0
1   115258827   5 HG00100  0|1
1   115258827   8 HG00101  0|0
1   115258827   6 HG00103  0|0
    
por Anna1364 03.05.2018 / 21:11

2 respostas

2

Tente:

awk 'FNR==NR{seen[$1]=$2; next} seen[$NF]{print $0, seen[$NF]}' file2 file1

Com a chave da coluna $ 1, salve o valor correspondente da coluna $ 2 em uma matriz associada chamada vista quando o awk lê somente em arquivo2 onde NR==FNR (sempre true para o primeiro arquivo de entrada quando houver vários arquivos de entrada para leitura), NR será definido como 1 no primeiro registro / linha lido por awk e incrementado até que todos os registros / linhas sejam lidos quer seja um arquivo de entrada único ou vários arquivos; FNR será definido como 1 no primeiro registro / linha lido por awk e incrementado até que todos os registros / linhas sejam lidos no arquivo de entrada atual e redefinido como 1 para o próximo arquivo.

O próximo bloco se o valor da última coluna corresponder ao mesmo valor de chave na matriz visualizada, em seguida, imprimirá a linha inteira de arquivo1 e o valor da mesma chave na matriz.

    
por 03.05.2018 / 21:16
4

Supondo que o campo no qual você deseja mesclar / ingressar os dados é classificado:

$ join -1 4 -o1.1,1.2,1.3,0,2.2 file1 file2
1 115258827 12 HG00099 0|0
1 115258827 5 HG00100 0|1
1 115258827 8 HG00101 0|0
1 115258827 6 HG00103 0|0

Isso une os dois arquivos na quarta coluna de file1 (especificado usando -1 4 , já que não é a primeira coluna desse arquivo) e a primeira coluna de file2 (essas são as colunas que os arquivos precisam para ser classificado em).

O -o sinalizador diz join quais campos nós gostaríamos de ver na saída, e de qual arquivo eles devem ser pegados ( 1.3 significa "o terceiro campo do primeiro arquivo", por exemplo e 0 significa o campo de junção).

O benefício de usar join é que nenhum arquivo deve ser lido completamente na memória.

Se os arquivos não estiverem classificados, você pode ordená-los de uma vez por todas usando

sort -k4 -o file1 file1
sort     -o file2 file2

ou, se você estiver usando um shell que entende de substituição de processo, você pode classificá-los ao mesmo tempo em que faz a junção usando

join -1 4 -o1.1,1.2,1.3,0,2.2 <( sort -k4 file1 ) <( sort file2 )

São os dados classificados que permitem que join mantenha apenas algumas linhas de cada arquivo na memória de cada vez.

    
por 03.05.2018 / 21:31