거의 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'
이 코드에서 나는:
- 확장자가 있는 모든 파일을 찾습니다
.fastq.gz
. **파일 이름에는 특수 문자(예: !?' ')를 포함할 수 없습니다. 내 댓글에 대한 adminbee의 답변을 참조하세요. cut
(1)의 출력은 구분 기호로 저장되고_
두 번째 출력은 (-f2
) 로 저장됩니다.sort
cut
텍스트- 고유한(예
uniq
:) 텍스트 만 유지 - 에 고유한 텍스트를 보냅니다
parallel
. parallel
최대 16개의 위치가 활성화 되었습니다 (-j 16
).- 각 병렬 작업에 대해 명령 실행
이 코드는 코드가 실행되는 디렉터리에서 input()과 일치하는'cat *{}*.fastq.gz > {}_R1.fastq.gz'
cat
모든 파일을 연결해야 합니다. 출력 파일을 호출합니다: .{}
uniq
102697-001-001_R1.fastq.gz
자동으로 포착되지 않는다는 것을 알고 있습니다 R1
. 누군가 R1
내 코드에서 이를 포착하는 방법을 제안할 수 있을까요?
이 코드의 가장 큰 장점은 이 작업을 다음과 같이 수행한다는 것입니다.모두카탈로그의 고유한 예입니다. 16개의 샘플(즉, Sample1_L001.fastq
and Sample1_L002.fastq
; Sample2_L001
및 Sample2_L002
; 등...) 에서 32개의 파일이 있습니다 . 이 코드는 샘플을 통해 모든 항목을 한 번에 연결합니다. 그래서 나는 Sample1.fastq
, Sample2.fastq
등 으로 끝났습니다 .