Selecione as linhas do arquivo 1 onde o campo do arquivo 2 x

0

Eu tenho um arquivo grande, file1, contendo muitas informações, por exemplo

rs969931    C   A   1.993   1.189   1.003 ..............
rs2745406   C   T   1.993   1.166   1.003 ..............
rs6939431   A   G   0.003   0.207   0.005 ..............
rs1233427   A   G   1.990   1.150   1.001 ..............

e um segundo arquivo, arquivo2, contendo a qualidade dessas informações, em que o valor da linha N do arquivo 2 corresponde à qualidade da linha N do arquivo 1

0.19893
0.94752
0.93768
0.47781

O que eu gostaria de fazer é selecionar as linhas do arquivo 1, onde o arquivo 2 > 0,5. O mais próximo que consegui encontrar é uma questão de correspondência de ID ( Selecione linhas de arquivo de texto que possuem ids listados em outro arquivo , considerando que aqui eu preciso executar alguma operação lógica usando os valores do arquivo 2.

A operação pode precisar ser executada várias vezes em arquivos grandes, portanto, evite soluções desajeitadas, como anexar o arquivo 2 ao arquivo 1 e removê-lo após a filtragem.

    
por E. Rei 05.12.2017 / 12:06

2 respostas

3

paste qual.txt data.txt | awk '$1 > 0.5'

Isso gerará primeiro os dados que contêm os valores de qualidade como a primeira coluna e os outros dados como as outras colunas usando paste . O código awk simplesmente seleciona e imprime as linhas cuja primeira coluna (a qualidade) é maior que 0,5.

Se você não quer a qualidade na saída:

paste qual.txt data.txt | awk '$1 > 0.5' | cut -f 2-

Para o exemplo dado, isso gerará

rs2745406   C   T   1.993   1.166   1.003 ..............
rs6939431   A   G   0.003   0.207   0.005 ..............
    
por 05.12.2017 / 12:21
2

Com awk e getline (consulte tudo sobre o getline para advertências)

$ # can also use: awk '{getline num < "file2"} num>0.5' file1
$ awk -v cmp_f='file2' '{getline num < cmp_f} num>0.5' file1
rs2745406   C   T   1.993   1.166   1.003 ..............
rs6939431   A   G   0.003   0.207   0.005 ..............
  • getline num < cmp_f salva uma linha de file2 a num
  • num>0.5 linha de impressão de file1 se a condição estiver satisfeita


Eu acho que a versão abaixo pode ser melhor

awk '(getline num < "file2")>0 && num>0.5' file1
    
por 05.12.2017 / 12:45