탭으로 구분된 행렬 수집 및 생성

탭으로 구분된 행렬 수집 및 생성

6개의 텍스트 파일(각각은 특정 예에 해당)이 있으며 각 파일은 다음과 같습니다.

Gene_ID Gene_Name   Strand  Start   End Length  Coverage    FPKM    TPM
ENSMUSG00000102735  Gm7369  +   4610471 4611406 936 0   0   0
ENSMUSG00000025900  Rp1 -   4290846 4409241 10926   0   0   0
ENSMUSG00000104123  Gm37483 -   4363346 4364829 1484    0   0   0
ENSMUSG00000102175  Gm6119  -   4692219 4693424 1206    0.328358    0.015815    0.008621

열 1과 2의 모든 요소를 ​​하나의 파일에 수집하고 각 샘플에 해당하는 tpm 값(열 9)을 새 파일에 수집하고 싶으므로 tpm 값이 없을 때마다 0을 입력합니다.

내 출력 파일은 다음과 같아야 합니다.

gene_id gene_name sample1_tpm sample2_tpm sample3_tpm ......sample6_tpm

답변1

awk이 솔루션은 gene_id 및 gene_name으로 인덱싱된 배열 의 6개 입력 파일 모두에서 TPM 값을 수집 file1하고 file6마지막으로 각 배열 인덱스에 대해 병합된 TPM 값을 인쇄하는 데 사용됩니다 . 누락된 TPM 값은 0으로 대체됩니다.

awk ' BEGIN { f=0 } { if ($1 == "Gene_ID") { f++; getline; } i = $1 " " $2 row[i] = row[i] " " (($9 == "") ? "0" : $9) } END { for (i in row) print i,row[i] } ' file1 file2 file3 file4 file5 file6

답변2

다음은 원하는 작업을 수행하는 Perl 스크립트입니다. tpm 샘플 배열("gene_idgene_name"으로 구성된 문자열 인덱스)을 포함하는 해시 배열을 구축합니다.

모든 파일 읽기가 끝나면 해시 배열의 각 요소를 인쇄합니다. 이 스크립트에는 정확히 6개의 요소가 필요하지 않으며 <= 6으로 제한되지도 않습니다. tpm 요소 수에 관계없이 작동합니다.

일부 gene_id에는 6개의 tpm 배열 요소가 있고 다른 일부에는 1, 5 또는 1000개의 요소가 있는 경우 각 gene_id는 해당 gene_id/gene_name에 대해 감지된 tmp 요소의 정확한 수를 인쇄합니다. 이를 기능이 아닌 버그로 처리하기 위해 추가할 수 있는 추가 코드는 아래를 참조하세요.

입력은 표준 입력으로 제공되거나 명령줄에서 처리할 파일 이름을 지정하여 제공될 수 있습니다.

#! /usr/bin/perl

my %samples = () ;

while(<>) {
    chomp;
    s/^\s*|\s*$//g;
    next if (m/^Gene_ID|^$/);

    my ($gene_id, $gene_name, undef,undef,undef,undef,undef,undef, $tpm) = split;
    $tpm = 0 unless (defined($tpm));

    push @{ $samples{"$gene_id $gene_name"} }, $tpm;
}

foreach my $key ( keys %samples ) {
    my ($gene_id, $gene_name) = split(/\s+/,$key);

    print "$gene_id\t$gene_name\t", join("\t", @{ $samples{"$gene_id $gene_name"} }), "\n";
}

이 스크립트의 출력은 탭으로 구분됩니다. 다른 것을 선호하는 경우 print스크립트의 줄을 편집하고 \t'를 모두 선호하는 구분 기호로 바꾸세요.

각 gene_id에 대해 정확히 6 tpm 요소가 인쇄되지 않은 경우 오류 메시지를 생성하고 종료하려면 my ($gene_id, $gene_name) = split(/\s+/,$key)이 줄 바로 뒤에 다음 코드를 추가하세요.

    my $count = scalar @{ $samples{"$gene_id $gene_name"} };
    if ($count != 6) { die "Warning: $gene_id $gene_name has $count element(s)\n"};

예제 출력:

귀하가 제공한 샘플 데이터의 복사본을 6개 만들고 sample.txt에 전화했습니다 sample6.txt. 위 스크립트를 perl로 저장하고 다음을 사용하여 실행 가능하게 sample.pl만듭니다 chmod +x sample.pl.

$ ./sample.pl sample*.txt
ENSMUSG00000104123  Gm37483 0   0   0   0   0   0
ENSMUSG00000102175  Gm6119  0.008621    0.008621    0.008621    0.008621    0.008621    0.008621
ENSMUSG00000102735  Gm7369  0   0   0   0   0   0
ENSMUSG00000025900  Rp1 0   0   0   0   0   0

관련 정보