複数のFASTQファイルをひとつのファイルにまとめる

複数のFASTQファイルを結合するにはawkを使おう
awk
FASTQ
Shell
Bioinfomatics
Published

August 31, 2023

Modified

September 20, 2024

TL;DR

catコマンドではなく、awk 1コマンドを使う。

catコマンドで連結した場合の問題点

複数のFASTQファイルを一つのFASTQファイルにまとめる時に、よく使われるコマンドはcatコマンドだと思う。 例えば以下のようにして結合する。

Code
get_seq <- function(name) {
  set.seed(sum(as.integer(charToRaw(name))))
  #nt <- sample(40:40, 1)
  nt <- 40L
  s <- stringr::str_glue(r"(@{name}
{sample(c("A", "T", "G", "C"), size = nt, replace = TRUE) |> paste(collapse = "")}
+
{sample(strsplit(rawToChar(as.raw(33:75)), "")[[1]], size = nt, replace = TRUE) |> paste(collapse = "")})") |> as.character()
  s
}

get_seq("seq1") |> writeLines("temp1.fastq", sep = "\n")
get_seq("seq2") |> writeLines("temp2.fastq", sep = "")
get_seq("seq3") |> writeLines("temp3.fastq", sep = "")
# temp1.fastqは末尾に改行がある
# temp2.fastqは末尾に改行がない
cat temp1.fastq temp2.fastq
@seq1
CTAGTGAGAATTGTACGAAGGGCCTGTACGGCGGAATTAC
+
=G**#8)*=.>*A=<6>&4=&(!2:>A2G@>F@H,HFH;3
@seq2
ACACTGTCTACGGTCGACTCCGACGGCGTACTCAAACAAG
+
F5B7E'A6++(3G5#@HBB9"236>#0J*B=43$8K5(23

しかし、これは改行文字が適切に入っていないと連結部分がおかしくなる。 手作業でFASTQファイルを出力・修正した場合、ファイル末尾に改行が入っていないことがあり、 改行がないFASTQファイルのあとに別のFASTQファイルを連結すると以下のようになる。

cat temp2.fastq temp1.fastq
@seq2
ACACTGTCTACGGTCGACTCCGACGGCGTACTCAAACAAG
+
F5B7E'A6++(3G5#@HBB9"236>#0J*B=43$8K5(23@seq1
CTAGTGAGAATTGTACGAAGGGCCTGTACGGCGGAATTAC
+
=G**#8)*=.>*A=<6>&4=&(!2:>A2G@>F@H,HFH;3

awk 1で連結する

awk 1コマンドで連結すると上記の問題を回避できる(引数の1はアクション省略、つまり全行でprintを実行)。

awk 1 temp2.fastq temp1.fastq
@seq2
ACACTGTCTACGGTCGACTCCGACGGCGTACTCAAACAAG
+
F5B7E'A6++(3G5#@HBB9"236>#0J*B=43$8K5(23
@seq1
CTAGTGAGAATTGTACGAAGGGCCTGTACGGCGGAATTAC
+
=G**#8)*=.>*A=<6>&4=&(!2:>A2G@>F@H,HFH;3

フォルダ内の全てのFASTQファイルを連結

find . -name \*.fastq > list_fastq_files.txt
cat list_fastq_files.txt | xargs -L1 -I{} awk 1 '{}' >> temp.fastq
cat temp.fastq
@seq3
CCATCGAAAGCAATAGACTAGCAGCTCCCTGTAGCTGGCT
+
H<)$K4!81'BE@#>E@@C4$*)'6%1>#"+HK"-*25>@
@seq1
CTAGTGAGAATTGTACGAAGGGCCTGTACGGCGGAATTAC
+
=G**#8)*=.>*A=<6>&4=&(!2:>A2G@>F@H,HFH;3
@seq2
ACACTGTCTACGGTCGACTCCGACGGCGTACTCAAACAAG
+
F5B7E'A6++(3G5#@HBB9"236>#0J*B=43$8K5(23