여러 파일에서 grep에 문제가 발생하고 원하는 출력을 얻지 못함

여러 파일에서 grep에 문제가 발생하고 원하는 출력을 얻지 못함

chr#(다른 염색체 번호)을 기반으로 여러 줄을 추출하기 위해 파일에서 다음 명령을 사용하고 있습니다. 이것은 단지 하나의 파일이 처리되고 있는 것입니다. 나는 이와 같은 8개의 파일을 가지고 있습니다. 각 파일에 대해 chr(1 ~ 22, 그 다음 chrX 및 chrY)에 대해 이 작업을 수행해야 합니다. 루프를 사용하지 않고 개별적으로 수행하고 있지만, 제가 보이신다면 내가 만드는 모든 출력에 헤더가 그대로 유지됩니다. 개별적으로 실행하면 출력에 헤더가 표시되지만, 8개 파일 모두에 대해 스크립트를 실행하면(예: 스크립트에서 8*24 명령을 차례로 실행하면) 출력에 헤더가 없습니다. 왜 이런 일이 발생하는지 말해 줄 수 있나요?

#!/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

나는 이것을 작업으로 실행하기 위해 qsub를 사용하고 있으므로 스크립트의 구조는 다음과 같습니다. 명령을 개별적으로 실행하면 작동하지만 이렇게 실행하면 출력 파일에 헤더가 인쇄되지 않습니다. 즉 ";"가 인식되지 않는 것 같습니다. qsub filename.sh 및 sh filename.sh를 사용하여 실행해 보았습니다. sh filename.sh를 사용하면 헤더가 콘솔에 인쇄되는 것을 발견했습니다. 따라서 명령 파일에는 ';' 앞에 세미콜론이 기록되지 않아야 합니다. 이 문제를 어떻게 해결할 수 있습니까?

원하는 출력:

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

하지만 내가 얻는 출력은 헤더가 없는 것보다 낮습니다.

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

답변1

다음과 같은 것이 필요합니다.

{ 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

또는

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

문제는 리디렉션이 하나의 명령에만 영향을 미친다는 것입니다. 리디렉션으로 출력을 무력화 하려면 head그룹화해야 합니다. grep하지만 awk여기가 더 나은 선택일 수도 있습니다.

관련 정보