TL;DR
cat
コマンドではなく、awk 1
コマンドを使う。
cat
コマンドで連結した場合の問題点
複数のFASTQファイルを一つのFASTQファイルにまとめる時に、よく使われるコマンドはcat
コマンドだと思う。 例えば以下のようにして結合する。
Code
<- function(name) {
get_seq set.seed(sum(as.integer(charToRaw(name))))
#nt <- sample(40:40, 1)
<- 40L
nt <- stringr::str_glue(r"(@{name}
s {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