filtrar e contar com grep em uma única passagem?

2

Estou usando grep no final de um conjunto de comandos canalizados para filtrar algumas linhas de um arquivo. Depois, vou querer fazer alguma aritmética com base no número de linhas restantes.

por exemplo.

chrN="chr1|chr2|chr3|chr4|chr5|chr6|chr7"
otherCommands | grep -Ew $chrN  > $ChIP".bed"
count_pos='wc -l $ChIP"bed" | awk '{print 1000000/$1}''

Parece-me muito cansativo depois de juntar um monte de comando para depois escrevê-lo em um arquivo e depois lê-lo novamente apenas para coletar um número. .. mas eu não sei como fazer isso.

Então, minha pergunta é como salvar o número de linhas que passaram no filtro do grep para a variável count_pos e salvar as linhas filtradas no arquivo também?

    
por Stephen Henderson 14.03.2014 / 17:22

2 respostas

5

Você pode usar um tee para gravar em um arquivo e stdout :

chrN="chr1|chr2|chr3|chr4|chr5|chr6|chr7"
count_pos=$(otherCommands |
  grep -Ew "$chrN" |
  tee "$ChIP.bed" |
  wc -l |
  awk '{print 1000000/$1}')
    
por 14.03.2014 / 17:33
6

Faça tudo com o awk. Inicialize o contador, conte e imprima (grep + count) com correspondência de padrões e contagem de saída no final:

awk 'BEGIN { c=0} pattern{ c++; print $0 } END{ print 1000000/c }'

Você não precisa imprimir se não quiser. Ou você pode usar print $0 > output_file dentro do awk para imprimir os resultados em um arquivo e contar com o stdout.

    
por 14.03.2014 / 17:27

Tags