여러 fastq 파일 연결

여러 fastq 파일 연결

거의 100개의 파일이 있는 폴더가 있는데, 각 그룹에는 16개의 파일이 있습니다. 16개 파일로 구성된 각 그룹을 하나의 파일로 연결해야 합니다. 예를 들어 파일 이름 집합은 다음과 같습니다.

randomString_$groupName- 

Nextseq500에서 실행되고 단일 가닥인 100개에 가까운 샘플이 포함된 폴더가 있습니다. 각 샘플은 4개의 레인이 있는 Nextseq500의 4개 Flowcell에서 실행되었습니다. 따라서 샘플당 16개의 fastq 파일이 생성됩니다(아래 예 참조). 이제 이 모든 파일을 연결하고 다음 이름의 출력을 생성하고 싶습니다.102697-001-001_R1.fastq.gz

HGTLWBGXX_102697-001-001_ATTACTCG-AGGCTATA_L001_R1.fastq.gz
HGTLWBGXX_102697-001-001_ATTACTCG-AGGCTATA_L002_R1.fastq.gz
HGTLWBGXX_102697-001-001_ATTACTCG-AGGCTATA_L003_R1.fastq.gz
HGTLWBGXX_102697-001-001_ATTACTCG-AGGCTATA_L004_R1.fastq.gz

HGVLWBGXX_102697-001-001_ATTACTCG-AGGCTATA_L001_R1.fastq.gz
HGVLWBGXX_102697-001-001_ATTACTCG-AGGCTATA_L002_R1.fastq.gz
HGVLWBGXX_102697-001-001_ATTACTCG-AGGCTATA_L003_R1.fastq.gz
HGVLWBGXX_102697-001-001_ATTACTCG-AGGCTATA_L004_R1.fastq.gz

HGWWHBGXX_102697-001-001_ATTACTCG-AGGCTATA_L001_R1.fastq.gz
HGWWHBGXX_102697-001-001_ATTACTCG-AGGCTATA_L002_R1.fastq.gz
HGWWHBGXX_102697-001-001_ATTACTCG-AGGCTATA_L003_R1.fastq.gz
HGWWHBGXX_102697-001-001_ATTACTCG-AGGCTATA_L004_R1.fastq.gz

HJJMYBGXX_102697-001-001_ATTACTCG-GCCTCTAT_L001_R1.fastq.gz
HJJMYBGXX_102697-001-001_ATTACTCG-GCCTCTAT_L002_R1.fastq.gz
HJJMYBGXX_102697-001-001_ATTACTCG-GCCTCTAT_L003_R1.fastq.gz
HJJMYBGXX_102697-001-001_ATTACTCG-GCCTCTAT_L004_R1.fastq.gz

위의 모든 파일은 이름이 지정된 하나의 파일로 연결되어야 합니다 102697-001-001_R1.fastq.gz(따라서 두 파일 사이의 문자열을 이름 _으로 유지하십시오)._

나는 시도했다:

$ cat HGTLWBGXX_102697-001-001_ATTACTCG-AGGCTATA_L001_R1.fastq.gz \
HGTLWBGXX_102697-001-001_ATTACTCG-AGGCTATA_L002_R1.fastq.gz \
HGTLWBGXX_102697-001-001_ATTACTCG-AGGCTATA_L003_R1.fastq.gz \
HGTLWBGXX_102697-001-001_ATTACTCG-AGGCTATA_L004_R1.fastq.gz \
HGVLWBGXX_102697-001-001_ATTACTCG-AGGCTATA_L001_R1.fastq.gz \
HGVLWBGXX_102697-001-001_ATTACTCG-AGGCTATA_L002_R1.fastq.gz \
HGVLWBGXX_102697-001-001_ATTACTCG-AGGCTATA_L003_R1.fastq.gz \
HGVLWBGXX_102697-001-001_ATTACTCG-AGGCTATA_L004_R1.fastq.gz \
HGWWHBGXX_102697-001-001_ATTACTCG-AGGCTATA_L001_R1.fastq.gz \
HGWWHBGXX_102697-001-001_ATTACTCG-AGGCTATA_L002_R1.fastq.gz \
HGWWHBGXX_102697-001-001_ATTACTCG-AGGCTATA_L003_R1.fastq.gz \
HGTLWBGXX_102697-001-001_ATTACTCG-AGGCTATA_L002_R1.fastq.gz \
HGTLWBGXX_102697-001-001_ATTACTCG-AGGCTATA_L003_R1.fastq.gz \
HGTLWBGXX_102697-001-001_ATTACTCG-AGGCTATA_L004_R1.fastq.gz \
HGVLWBGXX_102697-001-001_ATTACTCG-AGGCTATA_L001_R1.fastq.gz \
HGVLWBGXX_102697-001-001_ATTACTCG-AGGCTATA_L002_R1.fastq.gz \
HGVLWBGXX_102697-001-001_ATTACTCG-AGGCTATA_L003_R1.fastq.gz \
HGVLWBGXX_102697-001-001_ATTACTCG-AGGCTATA_L004_R1.fastq.gz \
HGWWHBGXX_102697-001-001_ATTACTCG-AGGCTATA_L001_R1.fastq.gz \
HGWWHBGXX_102697-001-001_ATTACTCG-AGGCTATA_L002_R1.fastq.gz \
HGWWHBGXX_102697-001-001_ATTACTCG-AGGCTATA_L003_R1.fastq.gz \
HGWWHBGXX_102697-001-001_ATTACTCG-AGGCTATA_L004_R1.fastq.gz > 102697_001_001_R1.fastq.gz

작동하지만 파일이 많기 때문에 수동으로 수행하고 싶지 않습니다.

답변1

for name in ./*.fastq.gz; do
    rnum=${name##*_}
    rnum=${rnum%%.*}

    sample=${name#*_}
    sample=${sample%%_*}

    cat "$name" >>"${sample}_$rnum.fastq.gz"
done

이는 현재 디렉토리의 모든 압축된 Fastq 파일을 반복하고 샘플 이름을 쉘 변수로 추출합니다 sample. 질문에 표시된 모든 파일 이름은 102697-001-001.

이 변수는 파일 이름 끝에 있는 비트를 rnum보유합니다 .R#

파일 이름을 가져와서 먼저 첫 번째 문자 앞의 모든 항목을 제거하고 첫 번째 문자 뒤의 모든 항목을 제거한 _다음 _결과에서 첫 번째 문자를 포함하여 샘플 이름을 추출합니다. rnum비슷한 방식으로 변수의 값을 추출합니다.

그런 다음 이 파일은 cat >>. 출력 파일 이름은 R#샘플 이름과 문자열로 구성 됩니다 .fastq.gz. 표시된 파일의 경우 이는 102697-001-001_R1.fastq.gz.

Gzip 압축 파일은 연결하기 위해 압축을 풀 필요가 없습니다. 결과 파일의 압축을 풀면 모든 Fastq 파일이 압축되지 않은 연결로 제공됩니다.


bash정규식을 사용하여 출력 파일 이름을 계산하는 또 다른 방법은 다음과 같습니다.

for name in ./*.fastq.gz; do
    if [[ "$name" =~ _([0-9-]+)_.*(..)\.fastq\.gz ]]; then
        outfile="${BASH_REMATCH[1]}_${BASH_REMATCH[2]}.fastq.gz"

        cat "$name" >>"$outfile"
    fi
done

파일 이름이 정규식과 일치합니다.

_([0-9-]+)_.*(..)\.fastq\.gz

이 두 그룹(괄호 안의 비트)은 파일 이름의 관련 부분을 선택합니다. 첫 번째 그룹은 문자열을 캡처합니다.오직숫자 또는 대시 문자로 구성됩니다. 그룹은 _양면에서 둘러싸여야 합니다. 파일 이름에서 이 비트가 일치하는 유일한 위치는 샘플 이름입니다.

첫 번째 그룹과 _후속 그룹 뒤에는 .*해당 비트까지 임의의 문자( ) 를 허용합니다 (..)\.fastq\.gz. 파일 이름 끝에 있는 문자열 \.fastq\.gz과 일치 하므로 마지막 그룹은 바로 앞의 문자열을 캡처합니다 ( 패턴은 임의의 문자와 일치하지만 점과 일치합니다)..fastq.gz(..)R1.\.

캡처된 두 그룹은 배열에 인덱스 1과 2 BASH_REMATCH(이름은 "Bash 정규식 일치"의 약자)로 저장되며 이를 사용하여 출력 파일 이름을 구성합니다.

답변2

나는 내 직업과 매우 유사한 일을 해야 합니다.

나에게 가장 깨끗한 해결책은 다음과 같습니다.

ls *.fastq.gz | cut -d '_' -f2 | sort | uniq | parallel -j 16 'cat *{}*.fastq.gz > {}_R1.fastq.gz'

이 코드에서 나는:

  1. 확장자가 있는 모든 파일을 찾습니다 .fastq.gz. **파일 이름에는 특수 문자(예: !?' ')를 포함할 수 없습니다. 내 댓글에 대한 adminbee의 답변을 참조하세요.
  2. cut(1)의 출력은 구분 기호로 저장되고 _두 번째 출력은 ( -f2) 로 저장됩니다.
  3. sortcut텍스트
  4. 고유한(예 uniq:) 텍스트 만 유지
  5. 에 고유한 텍스트를 보냅니다 parallel.
  6. parallel최대 16개의 위치가 활성화 되었습니다 ( -j 16).
  7. 각 병렬 작업에 대해 명령 실행
    'cat *{}*.fastq.gz > {}_R1.fastq.gz'
    
    이 코드는 코드가 실행되는 디렉터리에서 input()과 일치하는 cat모든 파일을 연결해야 합니다. 출력 파일을 호출합니다: .{}uniq102697-001-001_R1.fastq.gz

자동으로 포착되지 않는다는 것을 알고 있습니다 R1. 누군가 R1내 코드에서 이를 포착하는 방법을 제안할 수 있을까요?

이 코드의 가장 큰 장점은 이 작업을 다음과 같이 수행한다는 것입니다.모두카탈로그의 고유한 예입니다. 16개의 샘플(즉, Sample1_L001.fastqand Sample1_L002.fastq; Sample2_L001Sample2_L002; 등...) 에서 32개의 파일이 있습니다 . 이 코드는 샘플을 통해 모든 항목을 한 번에 연결합니다. 그래서 나는 Sample1.fastq, Sample2.fastq등 으로 끝났습니다 .

관련 정보