Grep vários arquivos e saída para vários arquivos em um único comando

0

Eu gostaria de usar um padrão específico de 244 arquivos e gerar os respectivos arquivos de saída para cada um deles em um único comando, como faço isso?

Meu comando para um único arquivo é o seguinte:

grep -v '@SQ' *.sam | grep -v '@HD' cut -f 3 | sort | uniq -c | sort -nrk1 > output_count_file.txt

Em vez de fazer isso 244 vezes para cada arquivo individual, como faço isso de uma vez?

Exemplos dos meus arquivos de entrada são:

A1_001.fastq.sam
A2_001.fastq.sam
B6_001.fastq.sam

Eu gostaria de obter algumas informações desses arquivos de entrada em seus respectivos arquivos de saída, por exemplo:

A1_001.txt
A2_001.txt
B6_001.txt

A partir desses arquivos de saída, preciso fazer um novo grep para combinar informações dos arquivos de saída em outro arquivo.

Se eu fizer grep para um desses arquivos, por exemplo, A1_001.fastq.sam, vou obter as seguintes informações:

33 chr20:4804587-4804609__hsa_VP64_wgcod_3_27753
33 chr13:113242648-113242670__hsa_VP64_wgcod_2_46197
32 chr8:144718034-144718056__hsa_VP64_wgcod_2_48778
30 chr6:24126264-24126286__hsa_VP64_wgcod_1_71312

Eu preciso identificar os nomes dos genes da segunda coluna (por exemplo, chr20: 4804587-4804609) comparando com um arquivo de referência que contém as seguintes informações:

GTGCGCAGCGCTGAGTGTCG    YBEY    NM_001006114_utr5_0_0_chr21_47706267_f;NM_058181_utr5_0_0_chr21_47706267_f  chr21   47706143    47706165
AGCAGGCGGACAGTAGGACG    AUP1    NM_181575_utr5_11_0_chr2_74756757_r chr2    74757053    74757075
TAGGGGCAATGAATGGCGAG    APEX2   NM_001271748_utr5_0_0_chrX_55026756_f;NM_014481_utr5_0_0_chrX_55026756_f    chrX    55026610    55026632

Espero que minha pergunta não seja muito complicada.

    
por user237179 22.06.2017 / 04:58

2 respostas

0

Você pode conseguir isso usando find com o sinalizador -exec . Isso passará por todos os arquivos no diretório e executará seu grep individualmente em cada arquivo. Você pode colocar um espaço reservado para o arquivo de saída para distingui-los.

O comando seria algo como isto:

$ find . -iname "*.sam" -exec grep -v '@SQ' {} | grep -v '@HD' cut -f 3 | sort | uniq -c | sort -nrk1 > {}_output_count_file.txt \;

Observação: eu não testei isso, então você provavelmente precisará corrigir alguns problemas com as fugas e espaços reservados, mas é um começo.

    
por 22.06.2017 / 05:15
0

Veja se você pode criar uma função que possa processar um único arquivo:

doit() {
  sam=$1
  grep -v '@SQ' "$sam".sam |
    grep -v '@HD' |
    cut -f 3 |
    sort |
    uniq -c |
    sort -nrk1 > "$sam"_count.txt
}
export -f doit

parallel doit {.} ::: *.sam
    
por 31.01.2019 / 22:22

Tags