Perl의 여러 출력 파일이있는 여러 디렉토리에서 스크립트 실행 (해시 키 값 비교 문제)

매튜 스나이더

나는 다음과 같은 스크립트를 가지고 있는데, 내가있는 현재 디렉토리를 검색하는 데 사용하고, 해당 디렉토리의 모든 디렉토리를 열고, 특정 RE와 일치하는 모든 파일을 엽니 다 (모든 파일과 같은 형식을 가진 fastq 파일). 네 줄이 함께 사용됨), 이러한 파일로 작업을 수행하고 각 디렉토리의 파일에 결과를 씁니다. (참고 : 실제 스크립트는 이보다 훨씬 많은 작업을 수행하지만 스크립트가 한 폴더에서 단순화 된 버전을 사용할 때 작동하기 때문에 폴더 반복과 관련된 구조적 문제가 있다고 생각하므로 여기에 단순화 된 버전을 게시하고 있습니다)

#!user/local/perl
#Created by C. Pells, M. R. Snyder, and N. T. Marshall 2017

#Script trims and merges high throughput sequencing reads from fastq files for a specific primer set

use Cwd;
use warnings;

my $StartTime= localtime;

my $MasterDir = getcwd; #obtains a full path to the current directory


opendir (DIR, $MasterDir);
my @objects = readdir (DIR);
closedir (DIR);
foreach (@objects){
    print $_,"\n";
}

my @Dirs = ();
foreach my $O (0..$#objects){
    my $CurrDir = "";
    if ((length ($objects[$O]) < 7) && ($O>1)){ #Checking if the length of the object name is < 7 characters. All samples are 6 or less. removing the first two elements: "." and ".."
        $CurrDir = $MasterDir."/".$objects[$O]; #appends directory name to full path
        push (@Dirs, $CurrDir);
    }
}

foreach (@Dirs){
    print $_,"\n";#checks that all directories were read in
}


foreach my $S (0..$#Dirs){
    my @files = ();
    opendir (DIR, $Dirs[$S]) || die "cannot open $Dirs[$S]: $!";
    @files = readdir DIR; #reads in all files in a directory
    closedir DIR;
    my @AbsFiles = ();
    foreach my $F (0..$#files){
        my $AbsFileName = $Dirs[$S]."/".$files[$F]; #appends file name to full path
        push (@AbsFiles, $AbsFileName);
    }

    foreach my $AF (0..$#AbsFiles){
        if ($AbsFiles[$AF] =~ /_R2_001\.fastq$/m){ #finds reverse fastq file
            my @readbuffer=();
            #read in reverse fastq
            my %RSeqHash;
            my $c = 0;
            print "Reading, reversing, complimenting, and trimming reverse fastq file $AbsFiles[$AF]\n";
            open (INPUT1, $AbsFiles[$AF]) || die "Can't open file: $!\n";
            while (<INPUT1>){
                chomp ($_);
                push(@readbuffer, $_);
                if (@readbuffer == 4) {
                    $rsn = substr($readbuffer[0], 0, 45); #trims reverse seq name
                    $cc++ % 10000 == 0 and print "$rsn\n";
                    $RSeqHash{$rsn} = $readbuffer[1];
                @readbuffer = ();
                }
            }
        }
    }
    foreach my $AFx (0..$#AbsFiles){
        if ($AbsFiles[$AFx] =~ /_R1_001\.fastq$/m){ #finds forward fastq file
            print "Reading forward fastq file $AbsFiles[$AFx]\n";
            open (INPUT2, $AbsFiles[$AFx]) || die "Can't open file: $!\n";
            my $OutMergeName = $Dirs[$S]."/"."Merged.fasta";
            open (OUT, ">", "$OutMergeName");
            my $cc=0;
            my @readbuffer = ();
            while (<INPUT2>){
                chomp ($_);
                push(@readbuffer, $_);
                if (@readbuffer == 4) {
                    my $fsn = substr($readbuffer[0], 0, 45); #trims forward seq name
                    #$cc++ % 10000 == 0 and print "$fsn\n$readbuffer[1]\n";
                    if ( exists($RSeqHash{$fsn}) ){ #checks to see if forward seq name is present in reverse seq hash
                        print "$fsn was found in Reverse Seq Hash\n";
                        print OUT "$fsn\n$readbuffer[1]\n";
                    }
                    else {
                        $cc++ % 10000 == 0 and print "$fsn not found in Reverse Seq Hash\n";
                    }
                @readbuffer = ();
                }
            }
            close INPUT1;
            close INPUT2;
            close OUT;
        }
    }
}
my $EndTime= localtime;
print "Script began at\t$StartTime\nCompleted at\t$EndTime\n"; 

다시 말하지만 스크립트가 폴더를 반복하지 않고 작동한다는 것을 알고 있습니다. 하지만이 버전에서는 빈 출력 파일 만 얻습니다. 이 스크립트에 삽입 한 인쇄 기능으로 인해 Perl이 INPUT2의 해시에서 키로 $ fsn 변수를 찾을 수 없음을 확인했습니다. 각 파일이 거기에 있고 폴더를 반복하지 않을 때 작동하므로 키가 일치한다는 것을 알기 때문에 이유를 이해할 수 없습니다. 그래서 내가 놓친 단순한 것이 있거나 이것이 내가 찾은 Perl의 메모리에 대한 일종의 제한입니다. 도움을 주시면 감사하겠습니다!

매튜 스나이더

내 문제는 해시를 선언하는 곳과 관련이 있습니다. 첫 번째 입력 파일을 찾은 후에 만 ​​선언하지만 어떤 이유로 든. 첫 번째 입력 파일을 검색하는 @AbsFiles의 모든 항목을 순환하는 foreach 루프 이전에 해시를 선언하지 않으면 스크립트가 실패합니다. 이는 해시가 모든 새 디렉토리에서 지워짐을 의미하기 때문입니다. 그러나 입력 파일 이름을 찾을 때 해시를 선언 (또는 지워야 함)해야하기 때문에 왜 실패했는지 이해하지 못합니다. 이전에 왜 작동하지 않았는지 알 필요는 없지만 이해하는 데 도움이되면 좋을 것입니다.

이 사실을 깨닫도록 도와 준 다른 사용자에게 크레딧을 주어야합니다. 그들은 내 질문에 대답을 시도했지만 대답하지 않았고, 그 대답에 대한 주석에서 내가 해시를 선언하는 위치에 대한 힌트를 제공했습니다. 이 답변은 이제 삭제되었으므로 해당 사용자가이 방향을 가리키고 있다고 생각할 수 없습니다. 나는 그들이 Perl에 대해 무엇을 이해하고 있는지 알고 싶습니다. 그것이 문제라는 것을 그들에게 분명히 보여주지 못했습니다. 데이터 분석과 회의로 바빠서 그 의견에 더 빨리 응답 할 수 없었던 점 사과드립니다.

이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.

침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제

에서 수정
0

몇 마디 만하겠습니다

0리뷰
로그인참여 후 검토

관련 기사

분류에서Dev

여러 디렉토리의 모든 파일을 삭제하는 cronjob을 통해 실행할 스크립트

분류에서Dev

여러 디렉토리의 여러 파일에서 문자 교체

분류에서Dev

Apache의 여러 루트 디렉토리에서 파일 제공

분류에서Dev

하나의 Google 스크립트에서 여러 시트 실행, 구문 오류

분류에서Dev

여러 디렉토리에서 중간 문자를 제거한 다음 디렉토리 + 파일 이름을 포함하도록 하위 디렉토리의 파일 이름을 바꾸는 스크립트

분류에서Dev

쉘 스크립트를 사용하여 파일과 현재 디렉토리에서 파일의 존재 비교

분류에서Dev

Bash 스크립트의 여러 파일에 대한 출력 NamingVariable

분류에서Dev

여러 디렉토리에있는 두 개의 해당 문자열 사이에서 파일 계산

분류에서Dev

이 Python 2.7 스크립트를 동일한 디렉토리의 여러 파일에서 어떻게 실행합니까?

분류에서Dev

Ant 스크립트를 작성하여 디렉토리에서 여러 입력을 입력하고 병렬로 실행하는 방법

분류에서Dev

여러 디렉토리에서 비슷한 이름의 파일 삭제

분류에서Dev

자바 스크립트에서 삭제 여러 개체의 키 값

분류에서Dev

동일한 키 스페이스에서 여러 Cassandra 스크립트 실행

분류에서Dev

한 번에 여러 파일 / 전체 디렉토리에서 ipynb 스크립트를 실행합니까?

분류에서Dev

파일에서 여러 그룹 행의 평균을 출력하는 스크립트

분류에서Dev

단일 키에 여러 값이있는 동안 DataFrame에서 Dictionary 로의 문제

분류에서Dev

여러 >> 두 개의 스크립트에 의해 동일한 파일로 리디렉션, 문장 중간 중단

분류에서Dev

Unix에서 한 번에 여러 디렉토리에서 동일한 쉘 스크립트 실행

분류에서Dev

텍스트 형식으로 된 여러 비디오 파일의 파일 이름, 크기 및 시간 길이가있는 디렉토리에서 파일 목록을 어떻게 생성합니까?

분류에서Dev

여러 디렉토리의 동일한 이름 파일에서 명령 실행

분류에서Dev

도커 컨테이너 시작시 하위 디렉토리의 여러 설정 스크립트를 실행할 수 있습니까?

분류에서Dev

Perl 스크립트에 여러 입력 파일을 제공하려면 어떻게해야합니까?

분류에서Dev

객체 키 / 값 쌍에 표준 키가없는 두 배열을 비교하여 누락 된 값을 자바 스크립트의 첫 번째 배열로 푸시

분류에서Dev

여러 값이있는 루비 해시의 특정 값에 액세스

분류에서Dev

PIL의 출력 (여러 파일)을 디렉토리에 저장

분류에서Dev

하나의 디렉토리에 여러 실행 스크립트를 넣고 해당 디렉토리를 소싱하여 모든 명령을 사용할 수 있도록 할 수 있습니까?

분류에서Dev

쉘 스크립트를 실행하는 여러 IP에 대해 잠시 작성

분류에서Dev

디렉토리의 여러 파일에서 Java 프로그램을 실행하고 고유 한 이름으로 출력

분류에서Dev

다른 서버의 테이블간에 데이터를 비교하기 위해 스크립트 실행 문제

Related 관련 기사

  1. 1

    여러 디렉토리의 모든 파일을 삭제하는 cronjob을 통해 실행할 스크립트

  2. 2

    여러 디렉토리의 여러 파일에서 문자 교체

  3. 3

    Apache의 여러 루트 디렉토리에서 파일 제공

  4. 4

    하나의 Google 스크립트에서 여러 시트 실행, 구문 오류

  5. 5

    여러 디렉토리에서 중간 문자를 제거한 다음 디렉토리 + 파일 이름을 포함하도록 하위 디렉토리의 파일 이름을 바꾸는 스크립트

  6. 6

    쉘 스크립트를 사용하여 파일과 현재 디렉토리에서 파일의 존재 비교

  7. 7

    Bash 스크립트의 여러 파일에 대한 출력 NamingVariable

  8. 8

    여러 디렉토리에있는 두 개의 해당 문자열 사이에서 파일 계산

  9. 9

    이 Python 2.7 스크립트를 동일한 디렉토리의 여러 파일에서 어떻게 실행합니까?

  10. 10

    Ant 스크립트를 작성하여 디렉토리에서 여러 입력을 입력하고 병렬로 실행하는 방법

  11. 11

    여러 디렉토리에서 비슷한 이름의 파일 삭제

  12. 12

    자바 스크립트에서 삭제 여러 개체의 키 값

  13. 13

    동일한 키 스페이스에서 여러 Cassandra 스크립트 실행

  14. 14

    한 번에 여러 파일 / 전체 디렉토리에서 ipynb 스크립트를 실행합니까?

  15. 15

    파일에서 여러 그룹 행의 평균을 출력하는 스크립트

  16. 16

    단일 키에 여러 값이있는 동안 DataFrame에서 Dictionary 로의 문제

  17. 17

    여러 >> 두 개의 스크립트에 의해 동일한 파일로 리디렉션, 문장 중간 중단

  18. 18

    Unix에서 한 번에 여러 디렉토리에서 동일한 쉘 스크립트 실행

  19. 19

    텍스트 형식으로 된 여러 비디오 파일의 파일 이름, 크기 및 시간 길이가있는 디렉토리에서 파일 목록을 어떻게 생성합니까?

  20. 20

    여러 디렉토리의 동일한 이름 파일에서 명령 실행

  21. 21

    도커 컨테이너 시작시 하위 디렉토리의 여러 설정 스크립트를 실행할 수 있습니까?

  22. 22

    Perl 스크립트에 여러 입력 파일을 제공하려면 어떻게해야합니까?

  23. 23

    객체 키 / 값 쌍에 표준 키가없는 두 배열을 비교하여 누락 된 값을 자바 스크립트의 첫 번째 배열로 푸시

  24. 24

    여러 값이있는 루비 해시의 특정 값에 액세스

  25. 25

    PIL의 출력 (여러 파일)을 디렉토리에 저장

  26. 26

    하나의 디렉토리에 여러 실행 스크립트를 넣고 해당 디렉토리를 소싱하여 모든 명령을 사용할 수 있도록 할 수 있습니까?

  27. 27

    쉘 스크립트를 실행하는 여러 IP에 대해 잠시 작성

  28. 28

    디렉토리의 여러 파일에서 Java 프로그램을 실행하고 고유 한 이름으로 출력

  29. 29

    다른 서버의 테이블간에 데이터를 비교하기 위해 스크립트 실행 문제

뜨겁다태그

보관