grep, awk, sed, coluna de impressão 2 correspondente em file1 e file2 column3

4

edit: Eu gostaria de combinar a coluna 1,2 do arquivo1.txt com a coluna de 1,3 do arquivo2.txt e imprimir as linhas correspondentes do arquivo2.txt

arquivo1.txt:

scaffold1   57482
scaffold1   63114
scaffold1   63118
scaffold1   63129
scaffold1   63139
scaffold1   63279
scaffold1   63294
scaffold2   65015
scaffold2   77268
scaffold2   77335

arquivo2.txt:

scaffold1   381 382 T/A +
scaffold1   384 385 T/A,G   +
scaffold1   385 386 G/C +
scaffold1   445 446 C/T +
scaffold1   57481   57482   T/A +
scaffold1   63113   63114   T/A,G   +
scaffold1   63128   63129   G/C +
scaffold2   65014   65015   G/A +
scaffold2   77267   77268   G/A +
scaffold2   77334   77335   C/T +

output.txt:

scaffold1   57481   57482   T/A +
scaffold1   63113   63114   T/A,G   +
scaffold1   63128   63129   G/C +
scaffold2   65014   65015   G/A +
scaffold2   77267   77268   G/A +
scaffold2   77334   77335   C/T +
    
por kapr0001 15.08.2016 / 14:25

3 respostas

9

Uma solução awk :

$ awk 'NR==FNR{a[$1$2]++;next}{if($1$3 in a){print}}' file1 file2 
scaffold1   57481   57482   T/A +
scaffold1   63113   63114   T/A,G   +
scaffold1   63128   63129   G/C +
scaffold2   65014   65015   G/A +
scaffold2   77267   77268   G/A +
scaffold2   77334   77335   C/T +

NR é o número da linha atual e FNR do número da linha atual do arquivo atual. Os dois serão iguais apenas enquanto o primeiro arquivo estiver sendo lido. Assim, o primeiro bloco só será executado enquanto o primeiro arquivo estiver sendo lido e, portanto, o primeiro e o segundo campos do primeiro arquivo serão salvos no array a . Então, quando o segundo arquivo estiver sendo processado, imprimiremos suas linhas somente se o primeiro e o terceiro campo estiverem presentes em a , portanto, somente se estiverem presentes no primeiro arquivo.

    
por 15.08.2016 / 14:38
1

Se os seus dados de exemplo puderem ser generalizados, existem algumas suposições que podem ser feitas:

  • Você só precisa corresponder à coluna 2 do arquivo 1 com a coluna 3 do arquivo 2
  • Os arquivos de entrada já estão classificados pelas colunas acima

Se essas são suposições justas, o seguinte comando join funciona:

join -1 2 -2 3 -o "1.1,2.2,2.3,2.4,2.5" file1.txt file2.txt > output.txt

A saída é:

scaffold1 57481 57482 T/A +
scaffold1 63113 63114 T/A,G +
scaffold1 63128 63129 G/C +
scaffold2 65014 65015 G/A +
scaffold2 77267 77268 G/A +
scaffold2 77334 77335 C/T +

Como alternativa, se essas não forem suposições válidas, podemos usar awk para reorganizar um pouco as colunas (combinar especificamente as colunas 1,2 do arquivo 1 e as colunas 1,3 do arquivo 2) e, em seguida, sort ( conforme exigido por join ). Então, join corresponderá às colunas combinadas.

join -o "1.2,2.2,2.3,2.4,2.5" <( awk '$1=$1"_"$2" "$1' file1.txt | sort ) <( awk '$1=$1"_"$3' file2.txt | sort )
    
por 15.08.2016 / 22:52
0

Tente usar "cortar" para capturar os campos obrigatórios, algo como:

cut -d$"\t" -f2 file1.txt | sort | > file1_col2.txt

O usuário cuonglm tem uma boa visão geral do uso do awk para comparar os arquivos e imprimir as correspondências:

Compare dois arquivos por linhas correspondentes e armazenar resultados positivos

    
por 15.08.2016 / 14:57