Problema com o grep em vários arquivos e sem obter a saída desejada

1

Estou usando o comando abaixo em um arquivo para extrair algumas linhas baseadas em chr # (números diferentes de cromossomos). Este é apenas um único arquivo estou trabalhando. Eu tenho 8 desses arquivos e para cada arquivo eu tenho que fazer isso para chr (1to 22 e, em seguida, chrX e chrY), não estou usando nenhum loop, eu fiz isso invidually, mas se você ver que eu quero que o cabeçalho seja intacto para cada um dos meus resultados. Se eu executar individualmente, recebo o cabeçalho na saída, mas se estou executando, mas se eu executar o script para todos os 8 arquivos juntos, que é como 8 * 24 comandos em um script um após o outro, a saída não tem nenhum cabeçalho. Você pode me dizer por que isso está acontecendo? Ajuda seria apreciada

#!/bin/sh
#
#$ -N DOC_gatk_chr
#$ -cwd
#$ -e err_DOC_gatk_chr.txt
#$ -o out_DOC_gatk_chr.txt
#$ -S /bin/sh
#$ -M [email protected]
#$ -m bea
#$ -l h_vmem=25G

more S_313_IPS_S7995.coverage.sample_interval_summary | head -n1; more S_313_IPS_S7995.coverage.sample_interval_summary | grep "chr1" > S_313_IPS_S7995.chr1.coverage
more S_313_IPS_S7995.coverage.sample_interval_summary | head -n1; more S_313_IPS_S7995.coverage.sample_interval_summary | grep "chr2" > S_313_IPS_S7995.chr2.coverage
more S_313_IPS_S7995.coverage.sample_interval_summary | head -n1; more S_313_IPS_S7995.coverage.sample_interval_summary | grep "chr3" > S_313_IPS_S7995.chr3.coverage
more S_313_IPS_S7995.coverage.sample_interval_summary | head -n1; more S_313_IPS_S7995.coverage.sample_interval_summary | grep "chr4" > S_313_IPS_S7995.chr4.coverage
more S_313_IPS_S7995.coverage.sample_interval_summary | head -n1; more S_313_IPS_S7995.coverage.sample_interval_summary | grep "chr5" > S_313_IPS_S7995.chr5.coverage
more S_313_IPS_S7995.coverage.sample_interval_summary | head -n1; more S_313_IPS_S7995.coverage.sample_interval_summary | grep "chr6" > S_313_IPS_S7995.chr6.coverage
more S_313_IPS_S7995.coverage.sample_interval_summary | head -n1; more S_313_IPS_S7995.coverage.sample_interval_summary | grep "chr7" > S_313_IPS_S7995.chr7.coverage
more S_313_IPS_S7995.coverage.sample_interval_summary | head -n1; more S_313_IPS_S7995.coverage.sample_interval_summary | grep "chr8" > S_313_IPS_S7995.chr8.coverage
more S_313_IPS_S7995.coverage.sample_interval_summary | head -n1; more S_313_IPS_S7995.coverage.sample_interval_summary | grep "chr9" > S_313_IPS_S7995.chr9.coverage

Estou executando-o como um trabalho com o qsub para que a estrutura do script seja semelhante a acima. Ele funciona se eu executar os comandos individualmente, mas se eu os executar assim, o cabeçalho não será impresso no arquivo de saída, o ';' não é reconhecido parece. Eu tentei executá-lo com o qsub filename.sh e sh filename.sh. Eu achei que com sh filename.sh o cabeçalho fica impresso no console. Então definitivamente o comando antes de ';' ponto-e-vírgula não está sendo gravado no arquivo. Como posso me livrar desse problema? Espero que esteja claro agora.

Saída desejada:

Target  total_coverage  average_coverage    IPS_S7995_total_cvg IPS_S7995_mean_cvg  IPS_S7995_granular_Q1   IPS_S7995_granular_median   IPS_S7995_granular_Q3   IPS_S7995_%_above_15
chr2:41460-41683    14271   63.71   14271   63.71   56  67  79  100.0
chr2:45338-46352    123888  122.06  123888  122.06  79  123 147 94.6
chr2:218731-218983  11653   46.06   11653   46.06   36  50  55  100.0
chr2:224825-225012  12319   65.53   12319   65.53   57  68  76  100.0
chr2:229912-230090  20983   117.22  20983   117.22  93  120 147 100.0
chr2:230947-231137  22386   117.20  22386   117.20  100 120 139 100.0
chr2:233074-233258  11710   63.30   11710   63.30   54  66  73  100.0
chr2:234086-234300  22952   106.75  22952   106.75  91  113 126 100.0
chr2:242747-242922  20496   116.45  20496   116.45  93  124 142 100.0
chr2:243469-243671  27074   133.37  27074   133.37  126 138 148 100.0

Mas a saída que estou recebendo está abaixo sem o cabeçalho

chr2:41460-41683    14271   63.71   14271   63.71   56  67  79  100.0
chr2:45338-46352    123888  122.06  123888  122.06  79  123 147 94.6
chr2:218731-218983  11653   46.06   11653   46.06   36  50  55  100.0
chr2:224825-225012  12319   65.53   12319   65.53   57  68  76  100.0
chr2:229912-230090  20983   117.22  20983   117.22  93  120 147 100.0
chr2:230947-231137  22386   117.20  22386   117.20  100 120 139 100.0
chr2:233074-233258  11710   63.30   11710   63.30   54  66  73  100.0
chr2:234086-234300  22952   106.75  22952   106.75  91  113 126 100.0
chr2:242747-242922  20496   116.45  20496   116.45  93  124 142 100.0
chr2:243469-243671  27074   133.37  27074   133.37  126 138 148 100.0

Por favor, deixe-me saber se está claro

    
por vchris_ngs 27.01.2015 / 12:07

1 resposta

1

Você precisa de algo assim:

{ head -n1 S_313_IPS_S7995.coverage.sample_interval_summary; 
  grep "chr1" S_313_IPS_S7995.coverage.sample_interval_summary; } >S_313_IPS_S7995.chr1.coverage

ou

awk 'NR==1 || /chr1/' S_313_IPS_S7995.coverage.sample_interval_summary >S_313_IPS_S7995.chr1.coverage

O problema é que o redirecionamento afeta apenas um comando. Para obter a saída de head e grep no redirecionamento, eles precisam ser agrupados. Mas awk é provavelmente a melhor escolha aqui.

    
por 27.01.2015 / 12:55