呼叫

2015-10-09 208 views
0

好了,所以我有一堆具有以下兩個格式中的一個文件名的:呼叫

採樣ID_Adapter-Sequence_L001_R1_001.fastq(如正向)

採樣ID_Adapter- Sequence_L001_R2_001.fastq(作爲反向)

正向和反向格式之間的唯一區別是文件名中的R1和R2元素。現在,我已經成功地使用戶能夠提供包含與下面的腳本,這些文件的目錄:

#!/usr/bin/perl 
use strict; 
use warnings; 

#Print Directory 

print "Please provide the directory containing the FASTQ files from your Illumina MiSeq run \n"; 
my $FASTQ = <STDIN>; 
chomp ($FASTQ); 

#Open Directory 

my $dir = $FASTQ; 
opendir(DIR, $dir) or die "Cannot open $dir: $!"; 
my @forwardreads = grep { /R1_001.fastq/ } readdir DIR; 
closedir DIR; 

my $direct = $FASTQ; 
opendir(DIR, $direct) or die "Cannot open $dir: $!"; 
my @reversereads = grep { /R2_001.fastq/ } readdir DIR; 
closedir DIR; 

foreach my $ffile (@forwardreads) { 
    my $forward = $ffile; 
    print $forward; 
    } 

foreach my $rfile (@reversereads) { 
    my $reverse = $rfile; 
    print $reverse; 
    } 

的問題

我想用上面的腳本做的是找到一種方法,將兩個數組的元素進行配對,這些元素來自相同的Sample ID。就像我說的,正向文件和反向文件(來自同一個樣本ID)之間的唯一區別是文件名的R1和R2部分。

我試過查找方法從數組中提取元素,但我想讓程序做匹配而不是我。

感謝您的閱讀,我希望你們能幫忙!

+1

您能否以純文本形式提供您的代碼?只需剪切並粘貼到您的文章中,突出顯示它,然後單擊「代碼示例」按鈕。如果您無法獲得格式化權限,則有人會解決此問題。 – Schwern

+1

謝謝!有代碼都準備好了! – Postan92

+0

如果你想要做的只是找到對,你不需要在perl腳本中完成。只需將輸出傳遞給像這樣的幾個額外的unix命令(假設在文件名的R1/2部分之前有3個下劃線):'your_script.pl | cut -d'_'-f 1,2,3 |排序| uniq -c | sort -n'。你所有的配對都會在最後。如果你想要的話,你也可以把它們寫出來並剪掉前面的空格/數字。你也可以在perl中做到這一點。它效率不高,但它很簡單,幾乎總是綽綽有餘。 – hepcat72

回答

-1

您必須解析出文件名。幸運的是,這非常簡單。剝離分機後,您可以split上的零件_

# Strip the file extension. 
my($suffix) = $filename =~ s{\.(.*?)$}{}; 

# Parse Sample-ID_Adapter-Sequence_L001_R1_001 
my($sample_id, $adapter_sequence, $uhh, $format, $yeah) = split /_/, $filename; 

現在,你可以做他們喜歡的東西。

我會建議幾件事情來改善代碼。首先,將文件名解析放入一個函數中,以便可以重複使用並保持主代碼更簡單。其次,將文件名解析爲一個散列,而不是一堆標量,這將更容易處理和傳遞。最後,將文件名本身包含在該散列中,然後該散列包含完整的數據。這,順便說一句,是OO編程的門戶藥物。

sub parse_fastq_filename { 
    # Read the next (in this case first and only) argument. 
    my $filename = shift; 

    # Strip the suffix 
    my($suffix) = $filename =~ s{\.(.*?)$}{}; 

    # Parse Sample-ID_Adapter-Sequence_L001_R1_001 
    my($sample_id, $adapter_sequence, $uhh, $format, $yeah) = split /_/, $filename; 

    return { 
     filename   => $filename, 
     sample_id   => $sample_id, 
     adapter_sequence => $adapter_sequence, 
     uhh     => $uhh, 
     format    => $format, 
     yeah    => $yeah 
    }; 
} 

然後,不要單獨尋找左右格式化的文件,在一個循環中處理所有內容。將匹配的左對和右對置於散列中。使用glob只能拿起.fastq文件。

# This is where the pairs of files will be stored. 
my %pairs; 

# List just the *.fastq files 
while(my $filename = glob("$FASTQ_DIR/*.fastq")) { 
    # Parse the filename into a hash reference 
    my $fastq = parse_fastq_filename($filename); 

    # Put each parsed fastq filename into its pair 
    $pairs{ $fastq->{sample_id} }{ $fastq->{format} } = $fastq; 
} 

然後你可以用%pairs做你喜歡的。以下是一個打印每個樣品ID及其格式的示例。

# Iterate through each sample and pair. 
# $sample is a hash ref of format pairs 
for my $sample (values %pairs) { 
    # Now iterate through each pair in the sample 
    for my $fastq (values %$sample) { 
     say "$fastq->{sample_id} has format $fastq->{format}"; 
    } 
} 
+0

我刪除了我的腳本的」foreach「組件後放置了你的代碼。這個錯誤也適用於分割。是否應該在我的代碼中保留foreach元素? 另外,我有以下unix命令,我想調用這兩個元素中的兩個元素我可以在按照你的建議設置它們之後調用它們中的每一個元素嗎? – Postan92

+0

@ Postan92你在'$ filename'中放置了什麼?聽起來像你從未指定過任何東西。至於你可以用'%pairs'做什麼,堅果! – Schwern

+0

在子程序中,我將'$ filename'稱爲'shift @ reads'。在子程序之外,在腳本結尾附近,我複製了您的建議。 – Postan92