Se duas colunas coincidirem parcialmente, substitua third por awk

1

Arquivo a.txt

chr:1:10539:A:C 10539 C A 0.545987 0.508902  0 0.36065 + 1
chr:2:13494:A:G 13494 A G 0.330493 0.0264746  0 0.733423 + 1
chr:7:13494:A:G 13494 A G 0.330493 0.0264746  0 0.733423 + 1

Arquivo b.txt

1 4972
2 4972
3 4972
7 4970

Estou procurando uma maneira de encontrar correspondência parcial entre $1 de a.txt e $1 b.txt e substitua $7 em a.txt pelo $2 correspondente de b.txt .

Para que a saída pareça

chr:1:10539:A:C 10539 C A 0.545987 0.508902  4972 0.36065 + 1
chr:2:13494:A:G 13494 A G 0.330493 0.0264746  4972 0.733423 + 1
chr:7:13494:A:G 13494 A G 0.330493 0.0264746  4970 0.733423 + 1

Obrigado por qualquer ajuda.

    
por ThePooh 15.01.2018 / 10:05

1 resposta

0

Uma abordagem awk :

$ awk 'NR==FNR{a[$1]=$2; next} {split($1,b,/:/); $7=a[b[2]]}1;' b.txt a.txt 
chr:1:10539:A:C 10539 C A 0.545987 0.508902 4972 0.36065 + 1
chr:2:13494:A:G 13494 A G 0.330493 0.0264746 4972 0.733423 + 1
chr:7:13494:A:G 13494 A G 0.330493 0.0264746 4970 0.733423 + 1

Explicação

  • NR==FNR{a[$1]=$2; next} : NR é o número da linha de entrada atual e FNR é o número da linha atual do arquivo atual. Os dois serão apenas iguais ao ler o primeiro arquivo. Portanto, isso salvará as informações de b.txt na matriz a cujos índices são os cromossomos de b.txt e cujos valores são os números associados. O next pula para a próxima linha e garante que o segundo bloco não seja executado por b.txt .

  • split($1,b,/:/); $7=a[b[2]] : só será executado por a.txt . Primeiro, ele divide o primeiro campo em : na matriz b . Então, o segundo elemento de b será o cromossomo. Em seguida, ele define o sétimo campo do arquivo como o que foi armazenado na matriz a do cromossomo armazenado em b[2] (isso é o que a[b[2]] significa: a[ b[2] ] ).

  • 1; : esta é uma abreviação de awk para "imprimir esta linha".

por terdon 15.01.2018 / 11:27