contando as linhas correspondentes

3

Eu tenho 2 arquivos de entrada. O arquivo de entrada1 é semelhante a este

Equus caballus
Monodelphis domestica
Saccharomyces cerevisiae S288c

Input2 se parece com isso (mostrando as primeiras 10 linhas)

>CM000377.2/60448635-60448529 Equus caballus chromosome 1, whole genome shotgun sequence.   ATCGCTTCTCGGCCTTTTGGCTAAGATCAAGTGTAGTATCTATTCTTATCAGTTTAAAACTAGTGGTGAAATGAGATGTAGACAGTAACATTTGAATTACAACATCA
>CM000377.2/105043590-105043453 Equus caballus chromosome 1, whole genome shotgun sequence. ATTGCTTCTTGGCCTTTTGGCTAAGATCAAGTATAGTATCTGTTCTCATCAATTTAAAAATGGCAATATAAATAGACCCATAGTAGATCCAGATAATGGTGTTATCAGAAAAGGACTTTAAGTAATTTAATATGTTCA
>CM000377.2/137942042-137941941 Equus caballus chromosome 1, whole genome shotgun sequence. ATCGCTTCTCAGACTTTTGGCTAAGATCAAGCGTAGTATCTGTTCTTATCAGTAATTAACTTCAGAAAAGTTAACTCATCTTCAGCAAGGCAGTAATCCCCT
>CM000377.2/97988860-97989002 Equus caballus chromosome 1, whole genome shotgun sequence.   ATCGCTTCTTGGCCTTTTGGCTAAGATCAAGTGTAGGAATCAATGAATTTCTGGTTATGGAGGCTAAAATGATATCTAATCTTGACTTAATCTAGGTCTCTTCAGTATTTGTCACCCTTTACTACATTCTCTGCTGATGCACT
>CM000377.2/77415658-77415776 Equus caballus chromosome 1, whole genome shotgun sequence.   ACTGCTTCTTCGCCTTTTGGCTAAAATCAAGTATAGTATCTGTTCTTACCAGTTTAAGTACTTTTTGTGCTTCTCATGGCTATAAGCCATAATTGCTGTTATAACGGTAAGGATTTTTC
>CM000377.2/172045138-172045024 Equus caballus chromosome 1, whole genome shotgun sequence. ATTGCTTCTTGGCCTTTCAGCTAAGATCAAGTGTTGTATCTGTTCGTATCAGTTTAAATCATTCTGCACCAAAGATATGTCTCTTCTTCTCCATTTATTAATTTGTTCACTTATT
>CM000378.2/50070490-50070688 Equus caballus chromosome 2, whole genome shotgun sequence.   ATTGCTTCTCGGCCTTTTGGCTAAGATCAAGTGTAGTAATTGATTATCTCAAGTTAAGGAGAACTCACTACATCCCAAAGTCTCATTCTTTGTCTGAGTCTTGACACACATACTTCTTTCTGTGAGTATGTCCCTATTGCCTGCAATTGGCAATCTAAACATTCAGTGAAAATCTTCATTAGCTTTGAATGAACCATGT
>CM000378.2/21366877-21367061 Equus caballus chromosome 2, whole genome shotgun sequence.   AAAGCGTCTCAGCCTTTTGGCTAAGATCAAGTGTAGTATCTGTAGCTAGTCTATAACCTGATTGATATGTCCATTTTACCCCAATATCATACCATTATGATTACTGTGGCTTTATATAGCAAATCTTGAACTCAGGTAGTATAAATCCTCTAACTCTGTTCTTTGTCAAAATGGTCTTGGCTATT
>CM000378.2/56987690-56987788 Equus caballus chromosome 2, whole genome shotgun sequence.   ATCGCTTCTCGGCCTTTTGGCTAAGATCAAGTGTAGTATCTGAACGTCGGCGCCCTCGTGAGGAGGCACAGCCTCTCGTTCCCTGCTCCTACACTCCTT
>CM000378.2/18244103-18244249 Equus caballus chromosome 2, whole genome shotgun sequence.   ATCGCTTCTCGGCCTTTTGGCTGAGATCAAGTGTAGAGCTTTGAATAGTATAATAATATTATTTTGATAGTAATAACAATAAACAATCGCTAGCATTAATGAGAGCTTAGTGTATGCCAGTCACCATGCTAAGTGCTCTAGATGCTT
>CM000370.1/74459482-74459563 Monodelphis domestica chromosome 3, whole genome shotgun sequence.    ATCACTTCTCTGCCTTTTGGCTAAGATCAAGTGTAGTATCAATAGATGCAGAAAGAGCTTTTGACAAAATACAACACCCATT
>CM000370.1/105243828-105243703 Monodelphis domestica chromosome 3, whole genome shotgun sequence.  ATTGTTTCTTGGCCTTTTGGCTAAGATCAAGTGTAGAAATATTGTTAAATAATTACTTGTAAGATCTCGGAGAAACTAGAGAAGGTATTTATTGTACCTGGGAGTTTCCCATTCCTGGAACTCTCT
>CM000370.1/143474511-143474342 Monodelphis domestica chromosome 3, whole genome shotgun sequence.  ATTGCTTCTCAACCTTTTGGCTAAGATCAAGTGTAGTATCTATATCCCAATGATGTTTGGGATACTTAGTATTTGGGCAGCTAGAACTCCTCTTCCTGAGTTAAAATCCAGCCAATCACTAGCTGTGTGGCCTTGGGTAAGTCACTTAACCCAGTTTGCCTCAGTTGTCT
>CM000371.1/104846407-104846597 Monodelphis domestica chromosome 4, whole genome shotgun sequence.  ATCGCTTCTCGGCCTTTTGGCTAAGATCAAGTGTAGTATCTGTTCTTATCAGTTTAATATCTGATACGTCCTCTATCCGAGGACAATATATTAAATGGATTTTTGAAGCAGGGAGTCGGAATAGGAGCTTGCTCCGTCCACTCCACGCATCGACCTGGTATTGCAGTACTTCCAGGAACGGTGCACCTCCC
>CM000371.1/104773987-104774177 Monodelphis domestica chromosome 4, whole genome shotgun sequence.  ATCGCTTCTCGGCCTTTTGGCTAAGATCAAGTGTAGTATCTGTTCTTATCAGTTTAATATCTGATACGTCCTCTATCCGAGGACAATATATTAAATGGATTTTTGAAACAGGGAGTCGGAATAGGAGCTTGCTCCGTCCACTCCACGCATCGACCTGGTATTGCAGTACTTCCAGGAACGGTGCACTTCCC
>BK006936.2/681858-681747 TPA: Saccharomyces cerevisiae S288c chromosome II, complete sequence. ATCTCTTTGCCTTTTGGCTTAGATCAAGTGTAGTATCTGTTCTTTTCAGTGTAACAACTGAAATGACCTCAATGAGGCTCATTACCTTTTAATTTGTTACAATACACATTTT

Eu quero grep linhas do arquivo de entrada2 que corresponde à entrada file1 e conta-as para obter o número total de vezes que a linha no arquivo de entrada1 ocorre no arquivo de entrada2

exemplo de saída

Equus caballus 10
Monodelphis domestica 5
Saccharomyces cerevisiae S288c 1

e assim por diante.

Eu usei isso para extrair as linhas correspondentes do arquivo input2 no file1

grep -Fwf input1 input2

Como posso contar quantas vezes cada linha na entrada1 ocorre na entrada2?

    
por user3138373 11.07.2018 / 23:14

4 respostas

1
perl -lne '
    $h{"$_"}=$h[@h]=$_,next if @ARGV && !exists $h{$_};
    for my $h (@h) { 1+index(s/\h+/ /rg, " $h chromosome ") && $s{$h}++; }
    }{print "$_ $s{$_}" for @h;
' file1 file2

Saída:

Equus caballus 10
Monodelphis domestica 5
Saccharomyces cerevisiae S288c 1

Explicação:

  • -n invocará Perl ler arquivo linha por linha E nenhuma impressão, a menos que seja solicitada.
  • -l fará RS = ORS = \n
  • Estruturas de dados envolvidas:

    • hash %h terá chaves como genes lidos em file1 .
    • array @h terá genes (não-dup) na ordem em que foram encontrados durante a leitura de file1 .
    • hash %s deve ter chaves com genes e valores como o número de vezes que esse gene foi visto em file2 .
  • Trabalhando:

    • @ARGV deve ter conteúdo de 1 arquivo ao ler o primeiro argumento (arquivo1) e vazio ao ler o segundo argumento (arquivo2). Portanto, a primeira linha será aplicada somente a file e preencherá o hash %h e a matriz @h .
    • A segunda linha será aplicada às linhas lidas de file2 e atualizará o hash %s para o número de vezes que um determinado gene foi encontrado em uma determinada linha.
      • index(str, substr) function retornará a posição da substring na string se encontrada, otw a -1 será retornada na falha.
    • A terceira linha será executada após o arquivo2 ter sido lido e o conteúdo do hash %s será impresso com base na ordem das chaves definidas pelo array @h .
por 13.07.2018 / 10:37
4

Você pode fazer isso com o seguinte:

grep -Fowf input1 input2 | sort | uniq -c

Isso produzirá a saída para trás da maneira que você quiser, mas se você precisar deles nessa ordem, poderá fazer:

grep -Fowf input1 input2 | sort | uniq -c | awk '{c = $1; $1 = ""; print $0,c}'
    
por 11.07.2018 / 23:27
2

Você pode fazer isso usando matrizes no Awk:

awk '
  NR==FNR {a[$0]==1; next} 
  {for(x in a) c[x] += $0 ~ x} 
  END {for (x in a) print x, c[x]}
' input1 input2
Equus caballus 10
Saccharomyces cerevisiae S288c 1
Monodelphis domestica 5

(Isso pode ser feito com uma única matriz, mas a IMHO é mais limpa com matrizes separadas para o conjunto de índices e a contagem.)

    
por 12.07.2018 / 01:09
1

Aqui está um script Python que faz o que você quer:

#!/usr/bin/env python
"""Count the occurrences of the lines in file1 inside file2."""

import sys

path1 = sys.argv[1]
path2 = sys.argv[2]

counts = dict()
with open(path1, 'r') as file1:
    for line1 in file1.read().splitlines():
        counts[line1] = 0
        with open(path2, 'r') as file2:
            for line2 in file2.read().splitlines():
                if line1 in line2:
                    counts[line1] += 1

for key, value in counts.iteritems():
    print("{}: {}".format(key, value))

Você pode executá-lo assim:

python count.py file1 file2

Em seus dados de exemplo, ele fornece a seguinte saída:

Monodelphis domestica: 5
Saccharomyces cerevisiae S288c: 1
Equus caballus: 10

E aqui está um script Bash que faz a mesma coisa:

#!/bin/bash

file1 = "$1"
file2 = "$2"

while read line; do
    count="$(grep -F "${line}" file2 | wc -l)"; echo "${line}: ${count}";
done < file1
    
por 11.07.2018 / 23:29