
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