awk를 사용하여 필요한 열을 추출하고 새 파일을 생성하려면 어떻게 해야 합니까?

awk를 사용하여 필요한 열을 추출하고 새 파일을 생성하려면 어떻게 해야 합니까?

gtf파일은 100개 이상의 디렉토리에 있습니다. 아래에서는 그들이 어떻게 생겼는지 보여줍니다.

SampleA
   |___________ SampleA.GRCh38.gtf
SampleB
   |___________ SampleB.GRCh38.gtf

gtf여기서는 두 개의 파일 만 예시로 보여드리겠습니다 .

SampleA.GRCh38.gtf다음과 같이:

# stringtie -e -B -p 8 -G /path/stringtie_output/stringtie_merged.gtf -o /path/SampleA.GRCh38.gtf /path/SampleA.sorted.bam
# StringTie version 1.3.3
chr1    StringTie       transcript      11594   191502  .       -       .       gene_id "MSTRG.7542"; transcript_id "MSTRG.7542.2"; cov "0.0"; FPKM "0.000000"; TPM "0.000000";
chr1    StringTie       exon    11594   14829   .       -       .       gene_id "MSTRG.7542"; transcript_id "MSTRG.7542.2"; exon_number "1"; cov "0.0";
chr1    StringTie       exon    14970   15038   .       -       .       gene_id "MSTRG.7542"; transcript_id "MSTRG.7542.2"; exon_number "2"; cov "0.0";
chr1    StringTie       exon    15796   16765   .       -       .       gene_id "MSTRG.7542"; transcript_id "MSTRG.7542.2"; exon_number "3"; cov "0.0";
chr1    StringTie       exon    16858   17055   .       -       .       gene_id "MSTRG.7542"; transcript_id "MSTRG.7542.2"; exon_number "4"; cov "0.0";
chr1    StringTie       exon    17233   17742   .       -       .       gene_id "MSTRG.7542"; transcript_id "MSTRG.7542.2"; exon_number "5"; cov "0.0";
chr1    StringTie       exon    17915   18061   .       -       .       gene_id "MSTRG.7542"; transcript_id "MSTRG.7542.2"; exon_number "6"; cov "0.0";
chr1    StringTie       exon    18268   19364   .       -       .       gene_id "MSTRG.7542"; transcript_id "MSTRG.7542.2"; exon_number "7"; cov "0.0";
chr1    StringTie       exon    189836  191502  .       -       .       gene_id "MSTRG.7542"; transcript_id "MSTRG.7542.2"; exon_number "8"; cov "0.0";
chr1    StringTie       transcript      11594   195411  .       -       .       gene_id "MSTRG.7542"; transcript_id "MSTRG.7542.6"; cov "0.0"; FPKM "0.000000"; TPM "0.000000";
chr1    StringTie       exon    11594   14829   .       -       .       gene_id "MSTRG.7542"; transcript_id "MSTRG.7542.6"; exon_number "1"; cov "0.0";
chr1    StringTie       exon    14970   15236   .       -       .       gene_id "MSTRG.7542"; transcript_id "MSTRG.7542.6"; exon_number "2"; cov "0.0";
chr1    StringTie       exon    185758  187287  .       -       .       gene_id "MSTRG.7542"; transcript_id "MSTRG.7542.6"; exon_number "3"; cov "0.0";
chr1    StringTie       exon    187376  187577  .       -       .       gene_id "MSTRG.7542"; transcript_id "MSTRG.7542.6"; exon_number "4"; cov "0.0";
chr1    StringTie       exon    187755  187890  .       -       .       gene_id "MSTRG.7542"; transcript_id "MSTRG.7542.6"; exon_number "5"; cov "0.0";
chr1    StringTie       exon    188130  188266  .       -       .       gene_id "MSTRG.7542"; transcript_id "MSTRG.7542.6"; exon_number "6"; cov "0.0";
chr1    StringTie       exon    188439  188584  .       -       .       gene_id "MSTRG.7542"; transcript_id "MSTRG.7542.6"; exon_number "7"; cov "0.0";
chr1    StringTie       exon    188791  188902  .       -       .       gene_id "MSTRG.7542"; transcript_id "MSTRG.7542.6"; exon_number "8"; cov "0.0";
chr1    StringTie       exon    195263  195411  .       -       .       gene_id "MSTRG.7542"; transcript_id "MSTRG.7542.6"; exon_number "9"; cov "0.0";
chr1    StringTie       transcript      11594   197912  .       -       .       gene_id "MSTRG.7542"; transcript_id "MSTRG.7542.5"; cov "0.0"; FPKM "0.000000"; TPM "0.000000";

다음 과 SampleB.GRCh38.gtf같이:

# stringtie -e -B -p 8 -G /path/stringtie_output/stringtie_merged.gtf -o /path/SampleB.GRCh38.gtf /path/SampleB.sorted.bam
# StringTie version 1.3.3
chr1    StringTie       transcript      11594   191502  .       -       .       gene_id "MSTRG.7542"; transcript_id "MSTRG.7542.2"; cov "0.0"; FPKM "0.000000"; TPM "1.000000";
chr1    StringTie       exon    11594   14829   .       -       .       gene_id "MSTRG.7542"; transcript_id "MSTRG.7542.2"; exon_number "1"; cov "0.0";
chr1    StringTie       exon    14970   15038   .       -       .       gene_id "MSTRG.7542"; transcript_id "MSTRG.7542.2"; exon_number "2"; cov "0.0";
chr1    StringTie       exon    15796   16765   .       -       .       gene_id "MSTRG.7542"; transcript_id "MSTRG.7542.2"; exon_number "3"; cov "0.0";
chr1    StringTie       exon    16858   17055   .       -       .       gene_id "MSTRG.7542"; transcript_id "MSTRG.7542.2"; exon_number "4"; cov "0.0";
chr1    StringTie       exon    17233   17742   .       -       .       gene_id "MSTRG.7542"; transcript_id "MSTRG.7542.2"; exon_number "5"; cov "0.0";
chr1    StringTie       exon    17915   18061   .       -       .       gene_id "MSTRG.7542"; transcript_id "MSTRG.7542.2"; exon_number "6"; cov "0.0";
chr1    StringTie       exon    18268   19364   .       -       .       gene_id "MSTRG.7542"; transcript_id "MSTRG.7542.2"; exon_number "7"; cov "0.0";
chr1    StringTie       exon    189836  191502  .       -       .       gene_id "MSTRG.7542"; transcript_id "MSTRG.7542.2"; exon_number "8"; cov "0.0";
chr1    StringTie       transcript      11594   195411  .       -       .       gene_id "MSTRG.7542"; transcript_id "MSTRG.7542.6"; cov "0.0"; FPKM "0.000000"; TPM "3.000000";
chr1    StringTie       exon    11594   14829   .       -       .       gene_id "MSTRG.7542"; transcript_id "MSTRG.7542.6"; exon_number "1"; cov "0.0";
chr1    StringTie       exon    14970   15236   .       -       .       gene_id "MSTRG.7542"; transcript_id "MSTRG.7542.6"; exon_number "2"; cov "0.0";
chr1    StringTie       exon    185758  187287  .       -       .       gene_id "MSTRG.7542"; transcript_id "MSTRG.7542.6"; exon_number "3"; cov "0.0";
chr1    StringTie       exon    187376  187577  .       -       .       gene_id "MSTRG.7542"; transcript_id "MSTRG.7542.6"; exon_number "4"; cov "0.0";
chr1    StringTie       exon    187755  187890  .       -       .       gene_id "MSTRG.7542"; transcript_id "MSTRG.7542.6"; exon_number "5"; cov "0.0";
chr1    StringTie       exon    188130  188266  .       -       .       gene_id "MSTRG.7542"; transcript_id "MSTRG.7542.6"; exon_number "6"; cov "0.0";
chr1    StringTie       exon    188439  188584  .       -       .       gene_id "MSTRG.7542"; transcript_id "MSTRG.7542.6"; exon_number "7"; cov "0.0";
chr1    StringTie       exon    188791  188902  .       -       .       gene_id "MSTRG.7542"; transcript_id "MSTRG.7542.6"; exon_number "8"; cov "0.0";
chr1    StringTie       exon    195263  195411  .       -       .       gene_id "MSTRG.7542"; transcript_id "MSTRG.7542.6"; exon_number "9"; cov "0.0";
chr1    StringTie       transcript      11594   197912  .       -       .       gene_id "MSTRG.7542"; transcript_id "MSTRG.7542.5"; cov "0.0"; FPKM "0.000000"; TPM "0.000000";

transcript세 번째 열에서만 추출하고 싶습니다 . transcript_id어떤 열이 10번째 열이고 TPM어떤 열이 마지막 열인지 추출하고 싶습니다. 단, TPM샘플 이름이어야 합니다.

출력이 다음과 같기를 원합니다.

Type        transcript_id      SampleA      SampleB
transcript   MSTRG.7542.2      0.000000     1.000000
transcript   MSTRG.7542.6      0.000000     3.000000
transcript   MSTRG.7542.5      0.000000     1.000000

답변1

각 파일에서 관련 레코드를 추출하고 결과를 두 개의 새로운 임시 파일에 써야 합니다( awk아마도 sort키 정렬을 사용하여). 다음은 파일 중 하나를 처리하는 예입니다.

awk '$3 == "transcript" {printf("%s %s %s ", $3, $10, $12, $18);}' SampleA.GRCh38.gtf | sort -k 2 > tf1

그런 다음 각 레코드에 각 파일의 최종 열 두 개가 포함되도록 join병합하여 생성된 두 개의 임시/중간 파일을 사용할 수 있습니다 .awk

join사용할 수 있는 명령의 예는 다음과 같습니다.

join -o 1.1,1.2,1.3,2.3 -1 2 -2 2 tf1 tf2

실행하기 전에 헤더 줄을 인쇄하고(예: command 사용 printf) 출력의 공백을 탭으로 바꾸 거나(예: 사용) 다른 스크립트를 사용하여 출력 형식을 지정할 join수 있습니다 .joinsedawk

이러한 예제를 통해 두 파일을 모두 처리하고 원하는 출력을 생성하는(그리고 임시 파일을 정리하는 등) 스크립트를 작성할 수 있어야 합니다.

데이터 파일의 크기에 따라 하나 awk(또는 pythonperl) 프로그램에서 모든 작업을 수행할 수도 있습니다(즉, 두 파일에서 선택한 모든 데이터를 동시에 메모리에 쉽게 보관할 수 있습니다).

답변2

관심 있는 줄에만 18번째 필드가 있으므로 join파일을 삭제한 다음 awk해당 파일이 포함된 파일을 삭제 하면 됩니다. NF==4다른 모든 행에는 필드가 2개만 있습니다.

계산된 경로에 대한 특정 가정도 있지만 SampleB적합하게 수정할 수 있습니다.

while IFS= read -r -d '' f; do                             #read the list of SampleA
        g=$(echo "$f" | sed "s/pleA/pleB/g")               #calculate path to SampleB
        if [[ -f "$g" ]]; then                             #check SampleB exists
                echo "$f" | sed "s/.*pleA\.//g"            #print sample No
                echo "Type transcript_id SampleA SampleB"  #print header
                                                           #do the join
                join -j 12 -o 1.3 -o 1.12 -o 1.18 -o2.18 <(sort -k 12 "$f") <(sort -k 12 "$g") | awk 'NF==4'
        fi   | sed 's/[;"]//g'| column -t                  #make it pretty
done < <(find . -type f -iname "*SampleA*" -print0)        #NULL separated list of SampleA

답변3

다음 명령을 사용해보십시오

1 단계

awk '$3 ~ /transcript/{print $0}' file1|awk '{print $3,substr($12,2,12),substr($NF,2,8)}' > out1

2 단계

awk '$3 == "transcript" {print substr($NF,2,8)}' file2  > out2

3단계

paste out out1.txt | awk 'BEGIN{print "Type        transcript_id      SampleA      SampleB"}{print $0}'



Output

Type       transcript_id SampleA    SampleB
transcript MSTRG.7542.2 0.000000    1.000000
transcript MSTRG.7542.6 0.000000    3.000000
transcript MSTRG.7542.5 0.000000    0.000000

관련 정보