fastq.gz로 끝나는 fastq 파일이 많이 있습니다.
rep1.fastq.gz
rep2.fastq.gz
rep3.fastq.gz
rep4.fastq.gz
.....
내 결과는 다음과 같을 것으로 예상됩니다.
rep1.fastq.gz 23516782
rep2.fastq.gz 45126780
rep3.fastq.gz 67543908
rep4.fastq.gz 76425368
라인 1은 각 입력 파일을 보여주고 라인 2는 각 파일의 시퀀스 수를 보여줍니다.
이를 달성하기 위해 각 파일의 시퀀스 수를 계산하고 각 파일 뒤에 기록된 숫자를 출력으로 작성하는 작은 bash 스크립트를 작성했습니다.
for sample in *.fastq.gz;do echo -en $sample "\t";(zcat $sample|wc -l)/4|bc ;done
오류가 발생합니다: -bash: 예기치 않은 토큰 '/4' 근처에 구문 오류가 있습니다.
답변1
시퀀스당 4줄을 가정하여 가능한 모든 오류를 무시합니다... 위에 표시된 명령은 다음 형식을 사용해야 합니다.
for file in *.fastq.gz; do echo -en $file "\t";echo "$(zcat $file| wc -l)"/4 |bc;done
답변2
당신은 이것을 실행하고 있습니다 :
(zcat $sample|wc -l)/4|bc
/4
그 안에 있는 유일한 것은 쉘이 이해하지 못하기 때문에 실패합니다. 나는 당신이 원하는 것이 무엇인지 의심결과명령의 값을 zcat $sample|wc -l
입력한 다음 해당 값을 인쇄하여 /4
에 전달합니다 bc
. 그렇다면 인용 $()
해야 할 뿐만 아니라 ()
다음과 같이 합니다.
echo "$(zcat $sample|wc -l)/4" | bc
따라서 이는 다음을 의미합니다.
for sample in *.fastq.gz; do
echo -en $sample "\t"; echo "$(zcat $sample|wc -l)/4" | bc
done
또는 휴대성을 높이려면 다음을 수행하세요.
for sample in *.fastq.gz; do
printf '%s\t%s\n' "$sample" "$(echo "$(zcat "$sample" | wc -l)/4" | bc )"
done
또는 다음 위치에서 전체 작업을 완료할 수 있습니다 awk
.
for sample in *.fastq.gz; do
printf '%s\t' "$sample"
zcat "$sample" | awk '!(NR % 4){k++}END{print k}'
done
그러나 fastq 형식의 정의에는 파일에 시퀀스당 4줄만 있음을 나타내는 내용이 없습니다. 데이터를 잘 알고 있다면 이 접근 방식을 사용할 수 있지만 임의의 fastq 파일을 처리해야 하는 경우 행이 4개만 있다고 가정할 수 없으며 전용 도구를 사용하는 것이 좋습니다.
이 Q&A가 흥미로울 수 있습니다.fastq 파일의 읽기 및 염기 수를 계산하는 빠른 방법은 무엇입니까?.
게다가FASTQ 파일형식 사양에서는 항목당 4줄만 있다고 가정할 수 없음을 명시합니다. 즉, 지난 7년 동안 임상 환경에서 인간 NGS 데이터를 사용한 광범위한 경험을 통해 제가 본 모든 파일에는 샘플당 4줄만 있었습니다. 하지만 저는 긴 데이터 읽기를 다루지 않으며 형식 자체가 더 많은 데이터를 읽을 수 있도록 허용하므로 고려해야 할 사항입니다.